Aar*_*ght 39
const
字段只能包含值类型或System.String
.它们必须在编译时是不可变的并且可以解析.
static readonly
字段一般可以保存引用类型,只能在运行时创建(字符串除外).这些可以(但不应该)是可变类型; 唯一不能改变的是引用本身.
如果需要维护作为引用类型的"常量"实例集,通常需要使用一组public static readonly
字段,例如System.Drawing.SystemColors的成员.
最后但并非最不重要的是,readonly
字段的初始化可以推迟到构造函数的执行,这意味着它即使只能写入一次,也不一定要用完全相同的值进行初始化.声明的真常量const
只能有一个值(在编译时指定).
ito*_*son 14
一个微妙但关键的区别是consts
在编译时statics
进行评估,而在运行时进行评估.这对版本控制有重要影响.例如,假设你写:
public const int MaxValue = 100;
Run Code Online (Sandbox Code Playgroud)
编译并运送程序集(程序集A).然后其他人写了一个引用MaxValue的程序集(程序集B).在这种情况下,值100将被编译到它们的程序集中以及您的程序集中.
如果你写了这个:
public static readonly int MaxValue = 100;
Run Code Online (Sandbox Code Playgroud)
那么他们装配中的参考将仅仅是参考.当有人跑大会B,价值100将从加载你的装配,装配A.
例如,这可能会影响简单的修补方案.如果您发布更新的程序集A,其中MaxValues声明为200,并且用户将该版本复制到先前版本(但不重新编译程序集B),则在第一个场景中,程序集B将继续运行,就好像MaxValues为100,因为这const
是编译到程序集B中的值.在第二个场景中,程序集B将获取新值,因为它static
在运行时加载非const 变量.
如你所说,static和const都附加到一个类型而不是一个类型的实例.但是,您仍然可以更改静态项目.您无法更改const项目.
不过要小心.如果您的const项是引用类型,则必须在编译时评估已分配的表达式,这意味着您可以给出引用的唯一可能值null
(具有值得注意的有用的字符串异常).
归档时间: |
|
查看次数: |
24036 次 |
最近记录: |