哪个更正确,为什么?

问题描述 投票:0回答:9

哪个实施更好还是没有区别?

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; } }
}
c# coding-style poco
9个回答
2
投票

我假设对于第二个版本你的意思是:

public class Simple
{
    private readonly IList<string> entries = new List<string>();
    public IList<string> Entries { get { return entries; } }
}

请注意,我已将

entries
变量设置为只读。

如果这就是您的意思,因为您不需要在类中的任何位置(除了可能在构造函数中)重新分配变量,那么我认为这比自动属性版本更可取。

它显示了明确的意图,即“意味着”是只读的 - 而自动属性仅表明它意味着“对外界”是只读的。有人(也许是您)可能最终会在稍后的类中更改自动属性的值,而忘记了最初的设计是将此属性设置为只读属性。 (当然,我们并不是真的在谈论完全不变性,因为任何人都可以在列表中添加或删除条目。) 如果您确实希望能够更改类中的属性值,请务必使用第一个版本。

表达了对只读字段版本的偏好,在实践中我发现自己使用自动属性,因为它需要读写的代码更少。但每次我这样做的时候,我都感觉很脏。理想情况下,我想要一种创建只读自动实现属性的方法,该属性只能在构造函数中设置,就像只读字段一样。 (该属性将由只读字段支持,并且 setter 调用将直接编译到字段分配中。)不过,我还没有听说过此类事情实际发生的任何计划。

没有真正的实际区别(#2 无法编译,你需要忽略 setter)。

只要 getter 中不需要逻辑,也不需要直接访问字段,这就是风格问题。


1
投票

如果将列表存储在字段中,您可以将该字段标记为

readonly


1
投票

public class Simple { private readonly IList<string> entries = new List<string>(); public IList<string> Entries { get { return entries; } } }


选项#2 一开始就无法编译。 

除此之外,在选项 #2 中,您可以完全省略 
set

0
投票
PropertyInfo.CanWrite

返回

false

    
选项 #1 更好,因为第二个你可能也错过了 
readonly
关键字。


0
投票

我更喜欢第二种方法。 这样,您就可以在构造函数运行之前使用该列表。 优点是,如果您要添加更多的类构造函数等,您不必担心/记住一遍又一遍地更新列表。

    


0
投票

大部分差异在于语法,这只是品味问题。


0
投票

选择对您来说更具可读性的选项(或者,如果您正在为具有一致风格的项目编写代码,请保持一致)。

它们几乎相同(我假设您打算将第二个示例中的实例变量声明为私有并省略设置器),但需要注意的一件事是自动实现的属性不能被标记为

readonly

0
投票

无论如何,就任何其他类而言,它们都是相同的,所以如果你决定改变主意,这是一个非常微不足道的改变。因此,选择有效的方法,不要太担心——这还不是单一风格真正成为“既定规范”的领域。

就个人而言,我仅在有

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>(); } }


0
投票

这与第二种方法等效:

public class Simple{    
  private readonly IList<string> entries;

  public IList<string> Entries { 
    get { return entries; }
  } 

  public Simple() {
    entries= new List<string>();    
  }
}

© www.soinside.com 2019 - 2024. All rights reserved.