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是的,我看到了,但答案有点偏离正切。它似乎没有解决这个问题