【问题标题】:What is the purpose of having a private variable when creating a public property? [duplicate]创建公共属性时使用私有变量的目的是什么? [复制]
【发布时间】:2014-03-18 21:55:07
【问题描述】:

我查看了堆栈溢出,但所有答案似乎都略有不同。

我想知道,简单明了。为什么是这种标准做法?

为什么要为属性创建私有局部变量?

为什么在我所见过的任何专业代码中都采用这种标准做法?

private int _widget;

public int widget
{
  get{ return _widget; }
  set{ _widget = value; }

}

这看起来不是多余和浪费吗?

没有人直接调用私有变量。你总是通过属性来设置它。

为什么不直接取消它?

使用这个时有没有我不知道的黑魔法?

public int widget {get; set;}

【问题讨论】:

  • @p.s.w.g 你应该这样回答。
  • 详细说明 p.s.w.g 所说的:以前不能创建单行属性。您需要底层私有变量。
  • 所以这只是早期的另一个保留?
  • @AMR 正确,auto-implemented properties 是在 C# 3.0 中引入的,所以在此之前这是唯一的方法。
  • @p.s.w.g 是的,我看到了,但答案有些离谱。它似乎没有解决问题

标签: c# properties


【解决方案1】:

如果你只是看简单的例子,你是对的,它看起来很浪费。

但是... 还有更多。

这是一篇更深入的好文章:Why Properties Matter 来自 Stack Overflow 传奇 Jon Skeet

首先,不公开公开类字段已成为最佳实践规则。你无法控制他的价值会发生什么。但是,如果您改用属性,则可以根据需要添加在后台经常发生的其他逻辑,而无需对类的公共接口进行任何更改。这可能是用于处理对有限资源(如网络/数据库等)的多次访问的代码。...

其次,使用带有支持字段的版本,您可以非常轻松地实现INotifyPropertyChanged 接口,以便将值与 WPF 和 Model-View-ViewModel (MVVM) 模式一起使用:

public string FavoriteColor
{
   get
   {
      return this.favoriteColor;
   }

   set
   {
      if (value != this.favoriteColor)
      {
         this.favoriteColor = value;
         if (this.PropertyChanged != null)
         {
            this.PropertyChanged(this, new PropertyChangedEventArgs("FavoriteColor"));
            }
         }
   }
}

(代码 sn-p 取自Basic MVVM QuickStart

第三:但是如果您需要从公共字段更改为属性 - 将获得不同的 IL 代码 - 您正在失去二进制兼容性。这可能会影响从访问更改的类的其他程序集的序列化和重新编译代码。如果您在部分更新中部署应用程序,而并非同时部署所有程序集,这将很糟糕。

另一方面,您可以使用支持字段或自动属性来实现属性,在这两种情况下,您将获得相同的 IL 代码,这意味着您破坏某些东西的风险更小。

【讨论】:

    【解决方案2】:

    自动属性(或auto-implemented properties)在 C# 3.0 之前不可用。

    也许第一个变体(带有支持字段)的一个优点是您可以将其值初始化为非默认值,而无需实现构造函数,例如:

    private int _widget = 123;
    public int widget
    {
      get{ return _widget; }
      set{ _widget = value; }
    }
    

    【讨论】:

      【解决方案3】:

      正如@pswg 和@Brandon 发布的那样,这是.Net 3.0 中添加的一个称为自动实现属性的功能,其想法是您不再需要在类中声明私有变量,只需声明公共属性和所有必需的处理以支持由框架完成。

      在过去,我们被要求编写您的第一个示例,我认识的人仍然喜欢这种方式。

      您可以在这里查看:http://msdn.microsoft.com/en-us/library/bb384054.aspx

      【讨论】:

        猜你喜欢
        • 2017-04-02
        • 2023-04-04
        • 1970-01-01
        • 2010-10-18
        • 1970-01-01
        • 1970-01-01
        • 2011-09-26
        • 2010-12-24
        • 2022-11-22
        相关资源
        最近更新 更多