const和readonly
区别:
1.const必须在定义时初始化,readonly则可以在构造函数里面初始化,也就是说const是编译时常量,readonly是运行时常量,所以const更高效,而readonly更灵活,在应用上推荐使用static readonly来代替const,以平衡const在灵活性上的不足,同时客服编译器优化const性能时,所带来的程序集引用不一致的问题
2.由于const的编译时常量,是存储在元数据中的,所以 const 只能是编译器能够识别的基本类型,而 readonly 需要在栈或者堆中分配独立的存储空间,可以是任何类型
3.const可以定义局部常量,readonly不行
4.const默认带 static 修饰符,readonly不是,所以如果 readonly 的变量不手动加上 static ,每一个实例就会单独拥有一个readonly
接下来证明以上几个区别
class TT
{
public static int a = 1;
public readonly int readonlyNum = 0;
public const string constStr = "Const String";
public TT()
{
readonlyNum = 1;
readonlyNum = 2;
Console.WriteLine("静态构造函数");
}
}
查看一下IL代码:
可以看到constStr 的修饰符默认带上了static
01 02将readonlyNum 赋值为0 ,08调用构造方法,10 11赋值为1,17 18赋值为2
这也印证了一个结论,在字段(不论是readonly 还是普通字段)定义时初始化,跟在构造方法里面初始化是没有区别的,仅仅是顺序不一样
在main方法里面调用这句话
Console.WriteLine(TT.constStr);
但是在IL代码里面就跟直接输出 字符串的内容是一样的,这就可以看出来const的变量类似于c/c++的宏定义,仅仅是简单的文字替换,不过这个文字替换是判断类型的,这也就是编译时常量、
这是在clr via c#里面的关于常量的一句话
class和struct
不同点:
class是引用类型,struct是值类型
class表现行为,struct常用于存储数据
clss可以继承类和接口,struct只支持实现接口
class可以声明无惨构造函数,析构函数,struct只能声明有参构造函数,且在有参构造函数里面必须把所有的字段和属性都赋值
实例化时,class要使用new,struct可以不使用new,但是使用字段和属性之前要先赋值,否则会报错
两者在new的时候,class需要先在堆上面开辟空间,然后初始化,struct只需要在栈上面初始化即可
接口和抽象类的区别
https://blog.csdn.net/qq_33413868/article/details/81508595
查看建议102
is和as
https://blog.csdn.net/qq_33413868/article/details/81413926
覆写和重改
https://blog.csdn.net/qq_33413868/article/details/81611043
深拷贝和浅拷贝
https://blog.csdn.net/qq_33413868/article/details/81430272
静态和非静态![](https://i-blog.csdnimg.cn/blog_migrate/0220fe409e8d927828f9321b6f39b388.png)
类构造函数(静态构造函数)和实例构造函数
据我所测试,静态字段永远在类构造函数里面分配空间和初始化,就算你没有手动写出来类构造函数
如上图,就算我已经注释了类构造函数,但是解析出来的IL代码依旧会生成类构造函数,并且在里面把message初始化
类构造函数和实例构造函数调用的时机
类构造函数只调用一次,在你首次使用此类的时候(不论是生成实例,还是类 . 字段)先调用类构造函数,后面再次使用不会调用
实例构造函数每次生成实例都会调用,如果是第一次使用此类,则先调用类构造函数,再调用实例构造函数