C#复习
Assemblies
文件名和类名可以不一样。
C#大小写敏感,@可以把关键字变成标识符,也可以原来忽略转义。
类型:
值类型:bool ,char ,sbyte,short,int,long,byte,ushort,uint,ulong,float,double,decimal,enums,structs.
引用类型:class,interface,arrays,delegates
值类型分配在栈上,初始化为0,false,'\0',复制时复制值。
引用类型分配在堆上,初始化为null,复制时复制值的引用。
枚举
数组
int[] a = new int[3];
Console.WriteLine(a.Length); // 3
int[][] b = new int[3][];
b[0] = new int[4];
Console.WriteLine("{0}, {1}", b.Length, b[0].Length); // 3, 4
int[,] c = new int[3, 4];
Console.WriteLine(c.Length); // 12
Console.WriteLine("{0}, {1}", c.GetLength(0), c.GetLength(1)); // 3, 4
注意Arrays.copy(a,b,t)将a的前t个复制到b的前t个。
int[] a1 = { 7, 2, 5 };
int[] b1 = new int[2];
Array.Copy(a1, b1, 2); // copies a[0..1] to b
Array.Sort(b1);
string
可以通过s[i]访问第i-1个元素,引用类型,但可以通过==或!=来判断值是否相等。
a.compareto(b),a<b则返回-1,a=b返回0,a>b返回1.
struct
不论什么时候,编译器都会给结构体一个默认无参构造器,也会拒绝你给它的无参构造器,所以这里说结构体无参构造器没有不太好,意思懂了就行。类就不一样了,你不给它它就自己造一个无参构造器,你给它一个构造器(不论有参无参),它就不管了,不给你默认无参构造器了。
Boxing(装箱):值类型转换为引用类型
Unboxing(拆箱):引用类型转换为值类型
typeof返回给定类型的类型说明符。
sizeof返回类型的字节数,只能用于值类型,只能用在unsafe块。
除局部变量,名称的使用可以先于声明。
switch case,可以用int,enum,string,char类型。
结构体内的字段在声明时不能初始化。const类型声明时必须初始化,常量不能为静态
out与ref参见https://blog.****.net/susan19890313/article/details/6841541
内部类可以访问外部类的所有成员,即使是private
外部类只能访问内部类的public成员
其它的类只能访问public的内部类。
嵌套的类型可以是structs,enums,interfaces和delegates
类只能继承自一个基类,但可以继承自多个接口
结构体不能继承也不能被继承。
as运算符用于改变类型,失败则为null类型。
方法只有声明为virtual才能在子类中重写。
静态方法不能被重载。
new打断继承
protected:子类和本类中可见
internal:程序集中可见
protected:它所在的程序集、本类和子类中可见。
抽象方法不能实现。
抽象方法隐含是virtual。
含有抽象方法的类是抽象类。
抽象类不能被实例化。
密封类不能被继承,但可以继承自其他类。
重写方法也必须声明为密封的,并且它的方法不能被virtual修饰。
如果==被重载,那么!=也要被重载
类可以继承自一个基类,但可以实现多个接口,结构体不能继承自任何类型,但可以实现多个接口。
实现接口的方法不能声明为重写,但可以为抽象。
方法可以是静态的,委托不是静态的。如果方法是静态的,那么类名必须表示出来。
异常:
注意异常的参数名在catch中可以省略。继承自system.Exception类。
C#可以不捕捉异常。如果没有捕捉,程序将终止aborted
第一种情况,F捕捉了异常,那么Main未捕获异常,就会调用H
第二种情况,F未捕获异常,而Main可以捕获EXC2,所以H不运行。
namespace是类型的容器,可以嵌套多个namespace,可以被别的文件调用。
属性和字段区别参见:https://blog.****.net/xwchen2017/article/details/64132065
多线程:
并不需要thread类的子类,任何无参void方法都可以作为线程启动。
如果终止线程,finally仍然会被执行。