c# - 创建公共(public)属性时使用私有(private)变量的目的是什么?

标签 c# properties

<分区>

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

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

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

为什么我看到的任何专业代码中都有这种标准做法?

private int _widget;

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

}

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

没有人直接调用私有(private)变量。您始终通过属性设置它。

为什么不直接取消它呢?

使用它时是否存在我不知道的黑魔法?

public int widget {get; set;}

最佳答案

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

但是... 还有更多。

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

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

其次,使用带有支持字段的版本,您可以非常轻松地实现 INotifyPropertyChanged 接口(interface),以便将值与 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"));
            }
         }
   }
}

(代码片段取自 Basic MVVM QuickStart )

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

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

关于c# - 创建公共(public)属性时使用私有(private)变量的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21865745/

相关文章:

c# - 动态创建 C# 类或对象

c# - 为什么 RhinoMocks 在 VB 和 C# 中表现不同?

c# - 获取鼠标指针下方的窗口句柄,同时忽略半透明窗口

java - Spring PropertyPlaceholderConfigurer 默认值覆盖实际属性值

C# 反射 : Fastest Way to Update a Property Value?

c# - 为什么在构造函数中使用属性时会出现堆栈溢出?

java - Spring Boot 中的外部 YAML 属性文件和普通属性文件

c# - 如何让一定数量的线程一直运行

c# - UWP GridView ItemHeight 基于连续最大的项目

c# - 在 HTML5 CSS 或 C#.NET 中裁剪图像