Const是常量
Const在编译时会被编译为静态成员,它确定于编译时期,属类型级,通过类型来访问。
现在通过以下几种情况来说明const常量:
(1)初始化
public const string _name;
这种方式是错误的,因为它的值须在编译时期确定,所以在声明要初始化。
(2)构造器中初始化
public const string _name= "宋江";
public ConstReadonly()
{
_name = "吴用";
}
会有异常。
·为const在字面上理解就是常量,而对于赋值来说,左边不能是常量
·构造器初始化是在运行时期,而常量是确定于编译时期
(3)局部应用
做为局部常量使用。在方法Hello中:
public string Hello()
{
const string _returnStr = "常量";
return _returnStr;
}
(4)用于引用类型
const只用于值类型和字串类型。如果是引用类型如:
public const object _object = new object();
会有异常:只能用null对引用类型进行初始化(字串除外)。
public const object _object = null;
因为new是运行时,而const是编译时。
Readonly
只读变量,也从以下几方面来说明:
(1)初始化
public readonly int _age;//=22;
public readonly int _age=22;
两种都可以。
如果在声明时不进行初始化,将赋值默认值。
(2)构造器
在构造器中修改。
public readonly int _age=22;
public ConstReadonly()
{
_age = 10;
}
测试:
ConstReadonly cc = new ConstReadonly();
Assert.AreEqual(10, cc._age);
而在构造器外和声明时初始化时,不能对只读变量赋值。
(3)局部应用
不能定义局部变量。
Static readonly
静态只读变量
(1)初始化
public static readonly string _password="123456";
在声明时可以初始化也可以不初始化。
(2)构造器
static ConstReadonly()
{
_password = "123";
}
可以在静态构造器中进行初始化或赋值。(静态构造器是不带访问修饰符,同时不能带参数。)
(3)局部应用
不可以做为局部变量使用。
在IL中:
·Const定义为:static literal
·readonly为private initonly
·static readonly 定义为static initonly
总结:
1》 const是静态的,由类型访问,不能与static同用;readonly不是静态的,由对象来访问,可以与static一起使用
2》 const须在声明时初始化,readonly可以在声明时初始化,也可以在构造器中初始化。如果是static readonly,可以在静态构造器中初始化。
3》 const可以定义字段和局部常量,readonly只能是字段
4》 const中用于值类型和字串,引用类型初始化为null
总之,常量是常量,变量不管是只读的,还是一般的还是静态的,它总归是变量。