首页 > 其他随笔 > C#中Readonly和const的区别

C#中Readonly和const的区别

其他随笔

这个问题其实很常识。写代码的时候突然想到的,作此备忘。

const和readonly这两个关键字都是用来表示常量,只不过标记为Readonly的变量可以在构造函数中动态赋值,const需要在变量声明的时候就初始化;如果将这两种常量放到单独的动态链接库中,然后编译整个项目,则应用程序对于readonly变量,是每次都从动态链接库中读取最新的常量值,而对于const变量是在编译的时候就写死到应用程序代码中了(我不知道这是不是编译器优化行为,反正我在VS2008下无论是Debug版本还是Release版本均是这样的行为)。

后面一点很重要,举一个简单的例子。我新建了两个工程,一个应用程序,一个是类库。

image

其中ClassLibrary1中定义了StaticResources类

public class StaticResources
{
    public const int ConstVar = 1000;
    public static readonly int ReadonlyVar = 1000;
}

在ConsoleApplication5中代码如下:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Const Variable is {0}", StaticResources.ConstVar);
        Console.WriteLine("Readonly Variable is {0}", StaticResources.ReadonlyVar);
    }
}

输出都是1000没有问题。

当写类库的人突然因为种种原因需要更新ConstVar和ReadonlyVar这两个常量,假设更新为2000。更新完之后,他觉得主应用程序没有做修改,就没有更新,只发布了最新的dll。结果呢,ReadonlyVar更新了,ConstVar没有更新。

image

对于Asp.net网站应用程序就更容易出现这样的问题了。一般我们引用的动态链接库都是放在网站下的bin目录。因为更新网站相对比较麻烦,所以有时候我们会偷懒,只更新动态链接库,这个时候就很容易出现上述的问题了。

鉴于此,一般我在定义常量的时候比较偏向于使用static readonly组合关键字。虽然有稍许的性能缺失,但是带来的更好的可维护性。

——Kevin Yang

本博客遵循CC协议2.5,即署名-非商业性使用-相同方式共享
写作很辛苦,转载请注明作者以及原文链接~
如果你喜欢我的文章,你可以订阅我的博客:-D点击订阅我的文章

  1. X﹏X 到现在还没有评论~
  1. 暂时没有trackbacks.