您的位置:首页 > 编程语言 > C#

【C#基础语言学习】:const,readonly 常量与只读的区别

2012-08-05 16:57 567 查看
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)局部应用

不能定义局部readonly变量。

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

总之,常量是常量,变量不管是只读的,还是一般的还是静态的,它总归是变量。

转自博客园:

点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: