随笔 - 139  文章 - 0  评论 - 421  阅读 - 17万

const,readonly字段的取舍!

如果想在类中定义某些常量字段,一般有两种选择,可以定义成const,也可以定义成readonly,这两种方式如何取舍呢?

在绝大多数情况下,readonly是要优于const的,因为readonly可以带来更大的灵活性!一般我们可以认为const是编译时常量,也就是说你引用const字段,在编译的时候就被替换成相应的常量值了!

例如:

public class MyClass

{

      public const int Count=0;

}

 

static void Main(string[] args)

{

     int i=MyClass.Count ;

}

 

在编译器看来,Main方法实际上相当于这样:

 

static void Main(string[] args)

{

     int i=0;

}

而readonly字段刚好和const字段相反,我们可以认为他是运行时常量,也就是说你引用readonly字段,他的值是运行时确定的,这样就带来了很大的灵活性

而const有时可能会破坏二进制的兼容性,看我们刚才那个例子,比如你的MyClass是定义在另外一个dll中而当前的项目是引用这个dll的,这到是没有什么问题!但是将来需求突然改变了,如果count需要赋值为100了,这样你不得不修改代码,发布一个dll的新版本!由于const字段是编译时常量,所有引用这个字段的代码在编译的时候就已经被替换为相应的值了(值是0),这样带来的问题是所有引用这个字段的程序集都需要重新编译才能正确运行,这样就破坏了二进制的兼容性!

而使用readonly字段就可以避免这个问题,因为所有引用readonly字段的代码编译的时候并没有被替换成字段的值!

那const是不是没有任何的优点了呢?

实际上编译时常量在效率上是优于运行时常量的,但是差别并不是很大 !

只有你真正的确定这个字段的值永远都不会变了,这时才使用const,这时可以获得有限的性能改善!

否则,最好使用readonly字段!

posted on   周雪峰  阅读(377)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
< 2009年6月 >
31 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 1 2 3 4
5 6 7 8 9 10 11

点击右上角即可分享
微信分享提示