Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建公共属性时使用私有变量的目的是什么?_C#_Properties - Fatal编程技术网

C# 创建公共属性时使用私有变量的目的是什么?

C# 创建公共属性时使用私有变量的目的是什么?,c#,properties,C#,Properties,我已经看过堆栈溢出,但所有的答案似乎都略有不同 我想知道,简单明了。为什么这是标准做法 为什么要为属性创建私有局部变量 为什么我所看到的专业代码中都有这样的标准实践 private int _widget; public int widget { get{ return _widget; } set{ _widget = value; } } 这难道不显得多余和浪费吗 没有人直接调用私有变量。您总是通过属性设置它 为什么不干脆取消呢 当我使用它的时候,有没有我不知道的黑魔法 pub

我已经看过堆栈溢出,但所有的答案似乎都略有不同

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

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

为什么我所看到的专业代码中都有这样的标准实践

private int _widget;

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

}
这难道不显得多余和浪费吗

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

为什么不干脆取消呢

当我使用它的时候,有没有我不知道的黑魔法

public int widget {get; set;}
自动属性(or)直到C#3.0才可用

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

private int _widget = 123;
public int widget
{
  get{ return _widget; }
  set{ _widget = value; }
}
自动属性(or)直到C#3.0才可用

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

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

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

回到过去,我们被要求写你的第一个例子,我知道有些人仍然喜欢这样


您可以在这里查看:

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

回到过去,我们被要求写你的第一个例子,我知道有些人仍然喜欢这样


你可以在这里查阅:

如果你只是看一个简单的例子,你是对的,它看起来像一种浪费

但是。。。 还有更多

下面是一篇非常好的文章,它的深度要大得多: 按堆栈溢出图例Jon Skeet

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

其次,使用带有backing字段的版本,您可以非常轻松地实现
INotifyPropertyChanged
接口,以使用WPF的值和模型-视图-模型(MVVM)模式:

(代码段取自)

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


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

如果您只看一个简单的示例,您是对的,这看起来像是浪费

但是。。。 还有更多

下面是一篇非常好的文章,它的深度要大得多: 按堆栈溢出图例Jon Skeet

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

其次,使用带有backing字段的版本,您可以非常轻松地实现
INotifyPropertyChanged
接口,以使用WPF的值和模型-视图-模型(MVVM)模式:

(代码段取自)

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


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

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