变量是内存里存储的,运行在cpu里的。
数据类型
值类型:所有的数值类型都是值类型(short int long float double、bool)、枚举、结构
引用类型:对象、字符串、object、数组
区别:
1、值类型
class Program { static void Main(string[] args) { int i = 10; int j = i; i = 20; Console.WriteLine(j); } }
所有的值类型是储存在栈里的,
值类型的赋值就是值的拷贝
j是没有变化的
2、引用类型
class Program { static void Main(string[] args) { string s1 = "aa"; string s2 = s1; s1 = "bb"; Console.WriteLine(s2); } }
引用类的值是储存在堆里面的,栈里面储存的只是它的引用地址。
引用类型的赋值,实际上就是地址的拷贝
s2也是没有变化的。
静态成员
要去调用一个类里面的非静态成员(字段、方法),需要通过类的一个对象调用。
1、当实例化一个类的对象,堆里面会将类里面的所有非静态成员(变量、方法)生成
2、当实例化一个类的对象,首先会在堆里检索该类的对象是否存在,如果在在就会重新拷贝一份。
class Person1 { public string name = "A"; public int age = 20; }class Program { static void Main(string[] args)//程序入口 { Person1 p1 = new Person1(); Console.WriteLine(string.Format("年龄是{0},姓名是{1}", p1.age, p1.name));//调用对象字段 可以写为静态字段就可以用类调用了。 Console.ReadKey(); } }
要去调用一个类里的静态成员,只需要通过类去调用。
class Person { public static int i = 10; public static void SayHello() { Console.WriteLine("大家好"); } } class Program { static void Main(string[] args) { Console.WriteLine(Person.i); Person.SayHello(); Console.ReadKey(); } }
比如:教室类 同学对象
使用某个同学的文具盒就需要通过对象调用
使用教室里公共的工具 拖把、扫帚 就通过为可以调用
未将对象引用到对象的实例
Person p1=null;
引用p1.age p1.name就会出现该错误 需要判断对象是否为空 调试时要查看对象为什么为空
尽可能的避免装箱拆箱 (苹果-苹果 苹果-打包-拆包-苹果)
装箱
把值类型变为引用类型
int i1 = 10;
string s3 = i1.ToString();拆箱
把引用类型变为值类型
string s4 = "10";
int i2 = Convert.ToInt32(s4);
成员变量(全局变量):写在类的里面,方法的外面
局部变量 写在方法的里面
静态变量 static
数据类型转换
隐式转换 低精度转高精度型
int i=10;
double d=Convert.ToDouble(i);
显示式转换 高精度型转低精度型(数据会损耗)
double d=10.45;
int i=Conver.ToInt32(d);
运算符
算术运算符:和JS相同 +-*/% ++ --
赋值运算符:= += -= /= *= %= ??
?: js
int i5 = 2 > 3 ? 10 : 20; 2>3吗,如果成立取值10 不成立 取20
??
a=b??c b等于空吗?等于a=c 不等于a=b
string s5 = null;
string s6 = "aaa";string s7=s5??s6; s5等于空吗?如果不等于取值s5 如果等于取值s6关系运算符 == !== < > <= >=
逻辑运算符 ||或 &&与 !非(取反)
String类
定义特点
1、字符的数组
把一个字符串转化为字符的数组,并打印
string s = "dfdfdf"; char[] a = s.ToCharArray(); for (int i = 0; i < a.Length; i++) { Console.WriteLine(a[i]); }
2.获取字符的长度 str.length;
3、字符串一创建,就不能被修改,重新获取时会在堆里创建一个。
4、s2=s1时,会在堆里拷贝一份。
方法
Compare方法
字符串对应ascii码的顺序
Console.WriteLine(string.Compare("a","bbbbb"));1
Equals 判断是否相等
Console.WriteLine(string.Equals("aa","aa"));
StartWith/EndWith判断一个字符串是否以一个字符串开头 结尾 返回值true/false
string s = "aabbcc";
Console.WriteLine(s.StartsWith("aabb")); 返回trueindexOf/LastindexOf某个指定字符或字符串第一次(最后一次)出现的位置索引
string s = "aabbcc";
Console.WriteLine(s.IndexOf("d")); 返回-1Console.WriteLine(s.IndexOf("b")); 返回索引2
SubSrting截取字符串
string s = "aabbcc";
Console.WriteLine(s.Substring(3));返回bbcConsole.WriteLine(s.Substring(3,1));返回b
insert 插入字符
string s = "aabbcc";
Console.WriteLine(s.Insert(3,"1"));返回aab1bccpadleft padright 补齐字符串
string s = "aabbcc";
Console.WriteLine(s.PadLeft(10,'@'));返回@@@@aabbccRemove方法 删除和剪切字符串
string s = "aabbcc";
Console.WriteLine(s.Remove(1,1));返回abbcc 开始删除的位置,删除的数量Trim去掉前后的空格
string s = " aabbcc ";
Console.WriteLine(s.Trim());返回aabbcc去掉数组里的某个字符
Char[] str1 = {' ', '@', '#', '$' }; //必须要加空格
string str0="@#$ "; //必须要加空格string str2 = " @China$# ";string str3 = str2.Trim(str1);string str4 = str2.Trim(str0.ToCharArray());Console.WriteLine(str3);//返回China Console.WriteLine(str4);//返回China
TrimSart去掉前面的空格 TrimEnd 去掉后面的空格
string str1 = " dfdf ";
Console.WriteLine(str1.TrimStart());返回 dfdf空格 Console.WriteLine(str1.TrimEnd());返回 空格dfdfCopyTo方法 复制字符串
string str1 = "dfdf";
char[] str2 = new char[100];str1.CopyTo(1, str2, 0, 3);//str1[1] str2 str2[0] str2[3]Console.WriteLine(str2);//返回fdfReplace 替换字符串
Console.WriteLine(("dfdfd").Replace("d","1").Replace("1","2"));返回22d
Format把一个内容传到字符串里
Console.WriteLine(string.Format("'{0}'","abc")); 返回'abc'
Console是System下面的一个类
WriteLine是Console类下面的一个方法
当一个类是静态的,所有的内容都是静态的