public class Foo
{
private readonly Bar _bar;
}
public class Foo2
{
private Bar _bar;
}
我认为将其标记为只读没有任何好处。它是私人的,如果我尝试在内部做一些修改它,那我是愚蠢的,因为我知道我希望我的班级表现如何?那么,有什么意义呢?我不认为这里有任何性能提升,所以不可能。
答案 0 :(得分:19)
让编译器阻止你变得愚蠢总是很好。
让编译器阻止其他人变得愚蠢是特别好的,即使他们不熟悉代码库。
它还可以告诉其他人阅读您的代码,该字段永远不会改变
答案 1 :(得分:4)
在您编写此课程时,您知道自己希望它如何表现。
可是:
您的声明允许编译器验证您的意图是否满足,廉价且重复。并且它与您和其他人沟通您的意图。
答案 2 :(得分:2)
你是对的,没有性能提升。但是,这里有一些关键的区别:
如果您打算创建一个不尝试修改_bar的类,那么它应该是一个只读字段。我可以在这里看到两件事:
现在,如果你打算将它保持为空,那么它应该只读 NOT ,直到调用另一个方法来初始化它。但是,为此,我会看Lazy<T>
。
基本上,这是你的电话。如果你真的要成为 ONLY 修改这个课程,我仍然会说遵循这些规则。这是实践它的最佳实践方式。 :)
答案 3 :(得分:1)
如果你想在实例化时分配它,那么Readonly是好的,但不希望它可以改变。我能想到的一个好方案可能是一个带有用户名/密码的数据库类。
public MyClass(string user, string password){
this.username = username;
this.password = password;
this.connect();
}
假设连接在整个持续时间内保持对象处于活动状态,那么存储此信息以供参考可能是有意义的,但是一旦建立连接就会阻止将来的更改。
答案 4 :(得分:1)
假设一个类应该包含一组可更改的T
,并且它有一个私有字段T[] theArray
。可以通过多种方式设置课程:
这三种不同的方法对线程安全等问题有不同的含义。如果readref-copy-modify-writeref序列放在Interlocked.CompareExchange
循环中,则第一个可以成为线程安全的。通过使单个元素写入线程安全,可以使最后一个成为线程安全的。但是,第二个只能通过所有写入操作共享一个整体列表共用的锁定并且要求读者仔细检查其操作以确保一致性,或者要求其具有线程安全性。所有读写访问都必须通过一个公共锁。
答案 5 :(得分:0)
它是私人的,如果我尝试在内部做一些修改它,那我就是愚蠢,因为我知道我希望我的班级表现如何?
如果您是唯一一个在项目历史中会查看或修改源代码并且您拥有完美记忆的人,那么,是的。无需评论或其他编程约定。只是牛仔吧。
否则,使用约定(重新)强制执行意图并不是一个坏主意。