.Net 视频学习第2季 C#面向对象
面向对象继承1
查找类的命名空间快捷键:alt+shift+F10
项目A中有类X,要在项目B中使用X的话,首先在项目B的引用当中添加项目A,然后在项目B的代码中添加using A;(假设项目A类X的命名空间就是A)或者在使用X时采用A.X的格式。
记录运行时间
Stopwatch sw = new Stopwatch(); sw.Start(); // 代码 sw.Stop(); Console.WriteLine(sw.Elapsed);
Start()和Stop()是类Stopwatch的方法,Elapsed是类Stopwatch的属性。
值类型的数据存储在栈中,引用类型的数据存储在堆中。
int a = 10; string s = "123";
我自己的理解是a会映射成地址,指向栈中某位置,该位置存放的是数据10;而s同样映射成地址,指向栈中某位置,该位置存放的是另一个内存地址,此地址指向堆中某位置,该位置存放的是数据“123”。
int a = 10; a = 20; string s = "123"; s = "456";
string的不可变性:a是值类型,对a重新赋值后,在栈中的数据10会被新数据20所覆盖;s是引用类型,对s重新赋值后,在堆中的数据“123”没有被销毁,而是在堆中另外开辟了空间存放新数据“456”,并且将栈中原本指向“123”的地址更换为指向“456”的地址。因此被覆盖的都是栈中的数据。重复给string赋值,会在堆中产生大量没有被指向的数据。
string s1 = "123"; string s2 = "123";
对上边的代码,直观的感觉是在堆中有两块空间分别存了2个“123”,然后在栈中s1存的是指向堆中第一个“123”的地址,而s2存的是指向第二个“123”的地址。但事实是,在堆中只有一个“123”,而在栈中s1和s2存储了相同的地址内容。
可以将string看成是只读的char数组,所以可以用索引来访问,但不能修改(只读属性)。注意,这只是理解上的方便,实际上string不是char数组,只是string类里边提供了一个通过索引来访问元素的方法。
当然string类也的确提供了转换为char数组的方法:
string s = "123"; char[] chs = s.ToCharArray();
而将char数组转换为string可以用string类的构造方法之一:
string s = "123"; char[] chs = s.ToCharArray(); chs[0] = ‘0‘; s = new string(chs);
这时候s="023",注意堆中依然存在数据“123”,只是栈中s存储的已经不是指向“123”的地址,而是指向“023”的地址。
StringBuilder sb = new StringBuilder(); string s = sb.ToString();
StringBuiler类有方法sb.Append(x);效率比重新开辟内存空间的string要高。
string类的一些属性和方法:
string s1 = "abc";string s2 = "abc"; // 通过属性Length获取字符串长度 int sl = s1.Length; // 字符串比较(C#操作符重载,支持字符串比较)if (s1 == s2){ Console.WriteLine("s1=s2");}else{ Console.WriteLine("s1!=s2");} // 字符串大小写转换string s3 = s1.ToUpper();string s4 = s1.ToLower(); // 同样是字符串比较,Equals()方法可以提供参数来控制比较方法,以下是比较s1和s2,同时忽略大小写
if (s1.Equals(s2, StringComparison.OrdinalIgnoreCase)){ Console.WriteLine("s1=s2");}
string的分割,Split()方法(重载6):第一个参数是char数组,存放要remove并作为分割的字符,第二个参数StringSplitOptions,枚举类型,None会将每个分隔符用NULL代替,而RemoveEmptyEntries则直接将分隔符去掉,方法返回一个string数组。
string s = "1 2 + 345 , 6"; char[] chs = {‘ ‘, ‘+‘, ‘,‘}; string[] sa = s.Split(chs,StringSplitOptions.RemoveEmptyEntries);
上述代码实现了将s中的空格,加号和逗号去掉,并且返回string数组,共4个元素,分别是“1”,“2”,“345”和“6”。