一、const与readonly的区别
const的值是在编译是确定的,它的值是保存在程序集的元数据,所以不分配内存.
这句话的意思大家可以自己Debug一下,无论是全局Const变量还是局部Const变量,单步调试时根本不会执行定义常量const string constMember = "const"这一行。
readonly是在运行时分配内存空间,至于如果分配内存,后面会开个单章专门讲变量的内存分配,这里不再多说.readonly变量可以有两个地方赋值,一个是在定义的时候去赋值,再就是在构造函数里面去赋值.
另外一点非常重要,比如有一个类库CSharpConstLib,里面包含了类SomeType
public class SomeType
{
public const int ConstField = 50;
public static readonly int ReadonlyField = 50;
}
另外一个控制台程序引用CSharpConstLib.dll
Console.WriteLine("Const field is {0}.", SomeType.ConstField);
Console.WriteLine("Readonly field is {0}.", SomeType.ReadonlyField);
这个时候运行exe文件输出50,50.
如果我们更改SomeType为
public const int ConstField = 500;
public static readonly int ReadonlyField = 500;
然后编译CSharpConstLib,再将控制台程序老的CSharpConstLib.dll替换掉,运行exe,输出是50,500.所以一定要编译.
二、static成员和非static成员
在一个类中定义全局的static成员和非static静态成员以及static构造函数和非static构造函数,执行顺序是static成员-->static构造函数-->非static静态成员-->非static构造函数.
无论对一个类创建多少个实例,它的静态成员都只有一个副本,意思是重新创建类实例的时候,非static成员会也会重新创建,而是static成员不会,并且static构造函数只会执行一次。
静态方法和属性不能访问其包含类型中的非静态字段和事件,另外不支持静态局部变量. 静态成员不能标记为 override、virtual 或 abstract,也就是不能重写,但能重载.