2011-11-02 93 views
4

关于在ASP.Net应用程序中使用这些变量,我有点混淆。C#ASP.Net Webforms - 字符串 - 静态与静态只读

public static string Complete = "Complete";

据我所知,这个值将是全球所有用户,但价值不保证因存在于应用程序池回收和值上,不分配循环?

public static readonly string Complete = "Complete";

是否readonly标志意味着该值始终可用由于与类的静态构造函数初始化得到,这意味着该值将始终可用?

据我所知,下面的readonly情况下会发生:

  1. 访问变量
    • 是阶级构成?没有?指定变量
  2. 应用程序重新启动
  3. 转到1

是否有对readonly和非只读版本之间有什么区别?我想我们也可以把它写成如下保证变量:

public static string Complete { get { return "Complete"; } }

+1

或者干脆写'公共常量字符串完成=“完成”;';-) –

+1

我要包括'const'但是,并不需要使用,如果说'更新所有引用组件const'? – Mig

+0

@MiG,这是一个非常强大的理由,不要轻易使用const;当你可以的时候,总是喜欢只读const。 – Icarus

回答

4

readonly将简单地停止改变变量被初始化一次保存的值。它不会影响静态的生命时间 - 它仍然和以前一样。

请注意,如果静态为参考,则readonly属性不会停止底层对象的变异,它只会停止更改静态变量的值 - 在类引用的情况下,该值是参考本身。

MSDN C对只读#文档:

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和静态回收,只读静态和常量之间的区别在于,如果尚未初始化,静态只是引发初始化。但是对于所描述的用法,const更合适。

+0

因此,在ASP.Net应用程序中,由于应用程序池回收,这两个变量总是会返回其预期值? – Mig

+0

@MiG如果只读静态被回收,只要该值不是一些疯狂的运行时确定的事情,那么'static readonly'和'const'将为你实现相同。这是因为静态会在初次访问时初始化。如果这个值是基本的,那么去'const'。 –

+0

对,我现在用它。而非'readonly'在首次访问时不会被初始化? – Mig

0

public static string Complete =“Complete”;

有保证。但它也可以修改。如果你想要它是一个常量,使用const。 ABOT常量

更多信息VS readyonly VS静态只读Here

0

readonly关键字告诉这个类变量只能连同其声明或在其c'tor初始化编译器(因为它是一个静态字段,无论如何,这两个选项是相同的)。

除此之外,没有其他区别。

HTH - 托马斯