将成员变量声明为只读有哪些好处?它只是为了防止在类的生命周期中有人更改它的值,还是使用这个关键字会导致任何速度或效率的改进?
当前回答
添加一个基本方面来回答这个问题:
属性可以通过省略set操作符来表示为只读。所以在大多数情况下,你不需要添加readonly关键字属性:
public int Foo { get; } // a readonly property
相比之下:字段需要readonly关键字来实现类似的效果:
public readonly int Foo; // a readonly field
因此,将字段标记为只读的一个好处是可以实现与没有设置操作符的属性类似的写保护级别——如果出于某种原因,不需要将字段更改为属性。
其他回答
如果你有一个预先定义或预先计算的值,需要在整个程序中保持不变,那么你应该使用constant,但如果你有一个值需要在运行时提供,但一旦分配,应该在整个程序中保持不变,你应该使用readonly。例如,如果你必须分配程序的开始时间,或者你必须在对象初始化时存储用户提供的值,并且你必须限制它进一步更改,你应该使用readonly。
有一种可能的情况是,编译器可以基于readonly关键字的存在进行性能优化。
这仅适用于只读字段也标记为静态的情况。在这种情况下,JIT编译器可以假设这个静态字段永远不会改变。JIT编译器在编译类的方法时可以考虑到这一点。
一个典型的例子:你的类可以有一个静态只读的IsDebugLoggingEnabled字段,在构造函数中初始化(例如基于配置文件)。一旦实际的方法被jit编译,当调试日志未启用时,编译器可能会省略代码的整个部分。
我没有检查这个优化是否在当前版本的JIT编译器中实际实现,所以这只是推测。
小心使用私有只读数组。如果客户端将这些对象作为对象公开(您可以像我一样为COM互操作这样做),客户端可以操作数组值。当将数组作为对象返回时,请使用Clone()方法。
WPF可以带来性能上的好处,因为它不需要昂贵的DependencyProperties。这对于集合尤其有用
添加一个基本方面来回答这个问题:
属性可以通过省略set操作符来表示为只读。所以在大多数情况下,你不需要添加readonly关键字属性:
public int Foo { get; } // a readonly property
相比之下:字段需要readonly关键字来实现类似的效果:
public readonly int Foo; // a readonly field
因此,将字段标记为只读的一个好处是可以实现与没有设置操作符的属性类似的写保护级别——如果出于某种原因,不需要将字段更改为属性。
推荐文章
- 实体框架核心:在上一个操作完成之前,在此上下文中开始的第二个操作
- 如何为构造函数定制Visual Studio的私有字段生成快捷方式?
- 如何使用JSON确保字符串是有效的JSON。网
- AppSettings从.config文件中获取值
- 通过HttpClient向REST API发布一个空体
- 如何检查IEnumerable是否为空或空?
- 自动化invokerrequired代码模式
- 在c#代码中设置WPF文本框的背景颜色
- 在c#中,什么是单子?
- c#和Java中的泛型有什么不同?和模板在c++ ?
- c#线程安全快速(est)计数器
- 如何将此foreach代码转换为Parallel.ForEach?
- 如何分裂()一个分隔字符串到一个列表<字符串>
- 如何转换列表<字符串>列表<int>?
- c#对象列表,我如何得到一个属性的和