C#中Readonly和const的区别
这个问题其实很常识。写代码的时候突然想到的,作此备忘。
const和readonly这两个关键字都是用来表示常量,只不过标记为Readonly的变量可以在构造函数中动态赋值,const需要在变量声明的时候就初始化;如果将这两种常量放到单独的动态链接库中,然后编译整个项目,则应用程序对于readonly变量,是每次都从动态链接库中读取最新的常量值,而对于const变量是在编译的时候就写死到应用程序代码中了(我不知道这是不是编译器优化行为,反正我在VS2008下无论是Debug版本还是Release版本均是这样的行为)。
后面一点很重要,举一个简单的例子。我新建了两个工程,一个应用程序,一个是类库。
![]()
其中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没有更新。
![]()
对于Asp.net网站应用程序就更容易出现这样的问题了。一般我们引用的动态链接库都是放在网站下的bin目录。因为更新网站相对比较麻烦,所以有时候我们会偷懒,只更新动态链接库,这个时候就很容易出现上述的问题了。
鉴于此,一般我在定义常量的时候比较偏向于使用static readonly组合关键字。虽然有稍许的性能缺失,但是带来的更好的可维护性。
你可能对下面的文章感兴趣

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



最新评论
这个错误应该是因为Java不支持命名组导致的,将(?.*)语 法改成(.*),然后后向引用的时候使用\1即可。 但是由于java还不支持平衡组,也就是压入弹出堆栈的操...
在Expresso工具上确实可以运行 ;我改成java正则表达式后(?s)<(?<Ht mlTag>[\\w]+)[^>]*\\s...
这得看具体场景,如果你的文件非常大,那么使用正则匹配可能效率 会明显不如自己写一个程序一行一行去统计来得高。但是至少这种方 式不用自己写代码。
支持喽!博客不错!
好办法,不过据说正则表达式性能不高