【问题标题】:Using a backing variable for getters and setters为 getter 和 setter 使用支持变量
【发布时间】:2012-10-05 05:42:57
【问题描述】:

也许这是一个愚蠢的问题,但是,我是 C# 的新手(更多来自 Java 背景)并且对我看到的关于属性的 getter 和 setter 的不同示例感到困惑。

在某些情况下,代码如下所示:

    private string _something;
    public string Something
    {
        get { return _something; }
        set { _something = value; }
    }

但是,在其他示例中,他们不使用此支持成员,因此更像这样:

    public string Something { get; set; }

我并没有真正看到使用这些支持变量 (_something) 的好处,除非您当然对变量的设置有一些复杂的逻辑。

我正在使用后一种方法编写程序,但想检查一下我没有遗漏任何内容。

有人可以简单解释一下为什么人们选择做前者吗?是不是更“好的做法”?

非常感谢!

【问题讨论】:

  • 我猜后者是原型定义,就像java中的interface
  • @SuzanCioc 不。是一样的 - 但是支持字段是由 C# 编译器为您实现的。
  • 啊不,我错了。这是具有隐式支持变量的新语法。
  • @Reed 是的,我认为是正统的。
  • 感觉就像在Java中一样:您可以在子类中覆盖简单的getter或setter逻辑。如果您只有Something 成员,您将无法做到。

标签: c# .net


【解决方案1】:

我并没有真正看到使用这些支持变量 (_something) 的好处,除非您当然对变量的设置有一些复杂的逻辑。

如果您不使用它,则没有任何优势。使用第二种方法,仍然有一个支持变量,但您让编译器完成添加它的工作。从 .NET 3.5 及更高版本开始,您当前的方法完全有效。

当然,一旦您需要引入额外的逻辑,那么自己管理后备存储就变得至关重要。

【讨论】:

  • 那么让编译器完成添加工作会产生更多开销吗?
  • @AngelBrighteyes 不 - 这与您自己编写完全一样。只是打字少了点。 (以及不同的编译器生成的字段名称)
  • @AngelBrighteyes - 这只是所谓的“语法糖”的一个例子。更短的代码,但在幕后的运作方式完全相同。
  • @ReedCopsey 感谢您的提醒^_^
【解决方案2】:

前一种语法在 .NET 3.5 之前是必需的,因此可以在旧代码中找到。

它在功能上是等效的。

【讨论】:

    【解决方案3】:

    使用第一种语法的一个很好的理由是用于 MVVM 架构,其中您的属性绑定到前端元素。

    类似:

        private string _something;
        public string Something
        {
            get { return _something; }
            set { 
                  _something = value; 
                  OnNotifyPropertyChanged("Something");
                }
        }
    

    这会提醒您的前端它的绑定属性已更改并且必须更新。

    【讨论】:

    • 啊,这也许正是我所看到的。我正在尝试使用 MVVC 架构构建我的应用程序,因此使用了大量教程来掌握它。我怀疑这就是我的困惑的根源。谢谢。
    【解决方案4】:

    公共字符串某事{得到;放; } 只是短手。在后台它正在做与上面完全相同的事情。

    【讨论】:

      【解决方案5】:

      第二种方法是Auto-Implement Property

      【讨论】:

        【解决方案6】:

        在您的实例中引用自动属性与声明公共字段相同,这会破坏Encapsulation Principle。因此,如果您不在同一个类中访问它们,请使用自动属性。否则,请使用成员(支持)字段并从本地方法中引用该字段,同时通过普通的 .NET 属性公开它们。

        在 .NET 3.0 中添加了自动属性作为语法糖,因此您不再需要在类中未引用的支持字段。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-03-27
          • 2012-06-12
          • 1970-01-01
          • 2017-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多