【问题标题】:Which one is better to have auto-implemented property with private setter or private field and property just getter?使用私有 setter 或私有字段和属性只是 getter 的自动实现属性哪个更好?
【发布时间】:2012-06-30 19:46:03
【问题描述】:

我的问题可能是老话题的一部分——“属性与字段”。

我的情况是变量对于外部类是只读的,但需要在类内部进行修改。我可以通过两种方式来处理它:

第一:

private Type m_Field;
public Type MyProperty { get { return m_Field; } }

第二:

public Type MyProperty { get; private set; }

在阅读了几篇文章(主要介绍了使用公共属性而不是公共字段的好处)后,我不知道第二种方法是否比第一种方法有一些优势,但编写的代码更少。我很感兴趣在项目中使用哪一个会更好(以及为什么),或者这只是个人选择。

也许这个问题不属于 SO 所以我提前道歉。

【问题讨论】:

  • 我认为你可以继续第二个

标签: c#


【解决方案1】:

第二个版本产生的混乱较少,但灵活性较差。我建议你使用第二个版本,直到你遇到需要第一个版本的情况,然后重构 - 无论如何更改都将是类本地的,所以不要太担心!

一般来说,少写代码是个好主意。您编写的代码越少,产生的错误就越少:)

【讨论】:

  • 灵活性较低的示例 - 如果您想为私有字段提供默认初始值,则必须先使用。
  • 第二种方法在哪些方面不够灵活? @Anchit 您可以在构造函数中设置默认值,就像使用私有字段一样。
  • @James,如果你想在设置/获取之前对支持字段做任何事情,那么你需要实现一个支持字段。但这可以在以后轻松完成,而且几乎没有必要。
  • @DarenThomas 是的,我实际上是想删除我评论的第一部分。我的回答实际上演示了一个使用它进行延迟加载的示例。
  • @James 如果该字段在 static 类中怎么办?
【解决方案2】:

第二个版本较短,所以我认为它通常更好。 例外情况是,当唯一的写访问发生在构造函数中时。然后我更喜欢第一个版本,因为这允许将字段标记为readonly

【讨论】:

    【解决方案3】:

    无论如何,第二个几乎都会编译成第一个,因此 IMO 总是使用第二个,因为它的代码更少且更整洁。

    我倾向于使用第一种方法的唯一场景是当我想懒惰地加载一个属性,例如

    private List<string> _items;
    ...
    
    public List<string> Items
    {
        get
        {
            if (_items == null)
            {
                _items = new List<string>();
                // load items
            }
            return _items;
        }
    }
    

    【讨论】:

    • 对于大多数人来说,这似乎是一种微优化,但是,当您开始为内存资源有限的移动设备编写应用程序时,它就会发挥作用。
    【解决方案4】:
    【解决方案5】:

    对于调试,第二个是最好的。否则,您必须在设置字段的每个位置放置断点。第二个你在属性集上放置一个断点。

    【讨论】:

      【解决方案6】:

      我个人更喜欢第二个版本,因为它写得更少,所以我可以利用时间进行更复杂的编码......另外在我看来它促进了懒惰的开发

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多