哪个实施更好还是没有区别?
1.
public class Simple
{
public IList<string> Entries { get; private set; }
public Simple()
{
Entries = new List<string>();
}
}
或2.
public class Simple
{
private readonly IList<string> entries = new List<string>();
public IList<string> Entries { get { return entries; } }
}
我假设对于第二个版本你的意思是:
public class Simple
{
private readonly IList<string> entries = new List<string>();
public IList<string> Entries { get { return entries; } }
}
请注意,我已将
entries
变量设置为只读。
如果这就是您的意思,因为您不需要在类中的任何位置(除了可能在构造函数中)重新分配变量,那么我认为这比自动属性版本更可取。
它显示了明确的意图,即“意味着”是只读的 - 而自动属性仅表明它意味着“对外界”是只读的。有人(也许是您)可能最终会在稍后的类中更改自动属性的值,而忘记了最初的设计是将此属性设置为只读属性。 (当然,我们并不是真的在谈论完全不变性,因为任何人都可以在列表中添加或删除条目。) 如果您确实希望能够更改类中的属性值,请务必使用第一个版本。
表达了对只读字段版本的偏好,在实践中我发现自己使用自动属性,因为它需要读写的代码更少。但每次我这样做的时候,我都感觉很脏。理想情况下,我想要一种创建只读自动实现属性的方法,该属性只能在构造函数中设置,就像只读字段一样。 (该属性将由只读字段支持,并且 setter 调用将直接编译到字段分配中。)不过,我还没有听说过此类事情实际发生的任何计划。
没有真正的实际区别(#2 无法编译,你需要忽略 setter)。
只要 getter 中不需要逻辑,也不需要直接访问字段,这就是风格问题。
如果将列表存储在字段中,您可以将该字段标记为
readonly
PropertyInfo.CanWrite
返回
false
。
选项 #1 更好,因为第二个你可能也错过了
readonly
关键字。
我更喜欢第二种方法。 这样,您就可以在构造函数运行之前使用该列表。 优点是,如果您要添加更多的类构造函数等,您不必担心/记住一遍又一遍地更新列表。
大部分差异在于语法,这只是品味问题。
选择对您来说更具可读性的选项(或者,如果您正在为具有一致风格的项目编写代码,请保持一致)。
它们几乎相同(我假设您打算将第二个示例中的实例变量声明为私有并省略设置器),但需要注意的一件事是自动实现的属性不能被标记为
readonly
无论如何,就任何其他类而言,它们都是相同的,所以如果你决定改变主意,这是一个非常微不足道的改变。因此,选择有效的方法,不要太担心——这还不是单一风格真正成为“既定规范”的领域。
就个人而言,我仅在有
readonly
变量时才使用第二个,否则使用第一个(打字较少)。嘿安德斯,自动实现的只读属性怎么样?
编辑
编辑后的问题有一个更简单的答案:如果该字段是
readonly
,则将其标记为 readonly
不区分
readonly
属性并不是什么大罪,但它绝对不如区分它们那么清晰(甚至可能有助于防止一些错误)。无论如何,第一个编译成该 IL 的等价物:
public class Simple{
private IList<string> entries;
public IList<string> Entries {
get { return entries; }
}
public Simple() {
entries= new List<string>();
}
}
这与第二种方法等效:
public class Simple{
private readonly IList<string> entries;
public IList<string> Entries {
get { return entries; }
}
public Simple() {
entries= new List<string>();
}
}