将成员变量声明为只读有哪些好处?它只是为了防止在类的生命周期中有人更改它的值,还是使用这个关键字会导致任何速度或效率的改进?
当前回答
我认为使用只读字段不会带来任何性能上的提升。这只是一个检查,以确保一旦对象完全构造,该字段不能指向一个新值。
然而,“readonly”与其他类型的只读语义非常不同,因为它是由CLR在运行时强制执行的。readonly关键字编译为.initonly,这是CLR可以验证的。
这个关键字的真正优点是生成不可变的数据结构。根据定义,不可变数据结构一旦构造就不能更改。这使得在运行时推断结构的行为变得非常容易。例如,将不可变结构传递给代码的另一个随机部分是没有危险的。他们永远不能改变它,所以你可以根据这个结构可靠地编程。
Robert Pickering写了一篇关于不变性的好处的博客文章。这篇文章可以在这里或archive.org上找到。
其他回答
请记住,readonly只应用于值本身,所以如果您使用引用类型,readonly只保护引用不被更改。实例的状态不受只读保护。
不要忘记有一种变通方法,可以使用out参数在任何构造函数之外设置只读字段。
有点乱,但是:
private readonly int _someNumber;
private readonly string _someText;
public MyClass(int someNumber) : this(data, null)
{ }
public MyClass(int someNumber, string someText)
{
Initialise(out _someNumber, someNumber, out _someText, someText);
}
private void Initialise(out int _someNumber, int someNumber, out string _someText, string someText)
{
//some logic
}
进一步讨论请访问:http://www.adamjamesnaylor.com/2013/01/23/Setting-Readonly-Fields-From-Chained-Constructors.aspx
用非常实际的术语来说:
如果在dll a中使用const,而dll B引用该const,则该const的值将被编译到dll B中。如果您使用该const的新值重新部署dll a, dll B将仍然使用原始值。
如果在dll a和dll B引用中使用该readonly,则运行时将始终查找该readonly。这意味着如果您使用该只读的新值重新部署dll A, dll B将使用该新值。
我认为使用只读字段不会带来任何性能上的提升。这只是一个检查,以确保一旦对象完全构造,该字段不能指向一个新值。
然而,“readonly”与其他类型的只读语义非常不同,因为它是由CLR在运行时强制执行的。readonly关键字编译为.initonly,这是CLR可以验证的。
这个关键字的真正优点是生成不可变的数据结构。根据定义,不可变数据结构一旦构造就不能更改。这使得在运行时推断结构的行为变得非常容易。例如,将不可变结构传递给代码的另一个随机部分是没有危险的。他们永远不能改变它,所以你可以根据这个结构可靠地编程。
Robert Pickering写了一篇关于不变性的好处的博客文章。这篇文章可以在这里或archive.org上找到。
小心使用私有只读数组。如果客户端将这些对象作为对象公开(您可以像我一样为COM互操作这样做),客户端可以操作数组值。当将数组作为对象返回时,请使用Clone()方法。
推荐文章
- 防止在ASP中缓存。NET MVC中使用属性的特定操作
- 转换为值类型'Int32'失败,因为物化值为空
- c#中有任何连接字符串解析器吗?
- 在Linq中转换int到字符串到实体的问题
- 是否可以动态编译和执行c#代码片段?
- 创建自定义MSBuild任务时,如何从c#代码获取当前项目目录?
- c#和Java的主要区别是什么?
- 在c#中创建一个特定时区的DateTime
- .NET中的属性是什么?
- csproj文件中的“Service Include”是干什么用的?
- 如何使用try catch进行异常处理是最佳实践
- 替换字符串中第一次出现的模式
- .NET中字节的字面后缀?
- 如何处理AccessViolationException
- c#忽略证书错误?