我在ASP.Net应用程序中使用这些变量时遇到了一些困惑。
public static string Complete = "Complete";
据我所知,这个值对于所有用户来说都是全局的,但是由于应用程序池的回收而不能保证该值的存在,并且在回收时未分配该值?
public static readonly string Complete = "Complete";
readonly
标志是否意味着由于使用类的静态构造函数初始化值,该值始终可用,这意味着该值始终可用?
据我所知,readonly
场景中会发生以下情况:
readonly
和非只读版本之间有什么区别吗?我想我们也可以按如下方式编写它来保证变量:
public static string Complete { get { return "Complete"; } }
答案 0 :(得分:4)
readonly
只会在初始化后停止变量所保持的值。它不会影响静电的使用寿命 - 它仍然和以前一样。
请注意,如果静态是引用,readonly
属性不会阻止底层对象发生变异,它只会阻止静态变量的值被更改 - 在类引用的情况下,那个值就是参考本身。
MSDN C#docs readonly:
http://msdn.microsoft.com/en-us/library/acdd6hb7(v=VS.100).aspx
当您谈到具有全局不变的值时,readonly
静态将对const
具有类似的影响(假设您正在使静态的事物对const
来说是可以忽略的)。当您第一次尝试访问静态时,它将在现场初始化,永远不允许更改。
所以:
public static readonly string Something = "what";
实际上会表现得像:
public const string Something = "what";
虽然后者是编译时常量,而前者不是 - 所以它的行为有一些关键的区别。我更多的是谈论全球可用价值不会改变的想法。
在ASP.NET和静态回收方面,readonly static和const之间的区别在于,如果尚未初始化,静态只会产生初始化的费用。但是,对于所描述的用法,const
更适合。
答案 1 :(得分:0)
public static string Complete =“Complete”;
有保证。但它也可以修改。如果您希望它是常量,请使用 const 。
更多信息abot const vs readyonly vs static readonly Here
答案 2 :(得分:0)
readonly
关键字告诉编译器这个类变量只能与其声明或它的c'tor一起初始化(因为它是一个静态字段,这两个选项无论如何都是等价的。)
除此之外,没有其他区别。
HTH - 托马斯