为什么实例变量始终是私有的,而 auto 属性将它们设置为公共变量?还是一样
本文关键字:变量 设置 一样 实例 为什么 属性 auto | 更新日期: 2023-09-27 18:34:54
我没有得到的是,
我知道汽车属性应该让事情变得更容易。
通常:
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
使用自动属性:
public string Name { get; set; }
但是,如果我们可以将实例变量声明为公共变量,就像在 auto 属性中一样,为什么我们不在普通版本中将实例变量也声明为公共呢?
那么这会和以前的完全一样吗?
:public string name;
public string Name
{
get { return name; }
set { name = value; }
}
尽管您可以这样做,但想象一下使用此 API 并看到您有object.Name
和object.name
。你怎么知道使用哪一个?
通常,公共字段被认为是不好的做法,因为您授予该类的用户完全权限。即使 auto 属性提供相同的功率,也可以更轻松地向资源库或 getter 添加计算/过滤器,或者完全删除资源库或 getter。
通过公开支持字段,您可以让用户完全忽略您设置的任何验证。
我想你可能在这里感到困惑。
正如您在此 sharplab.io 示例中所看到的,
public string Name { get; set; }
编译成:
private string <Name>k__BackingField;
public string Name
{
get { return this.<Name>k__BackingField; }
set { this.<Name>k__BackingField = value; }
}
所以你可以看到,实际的字段是存在的,但是每个人都无法访问它,所以它就像超级私有的。但是,有时您可能不希望这样做。我遇到过几次,我实际上希望属性的类能够访问私有支持字段,以避免调用集合和gets,避免无限循环,尽管我觉得这可能是一个不好的做法,应该避免。
但重点是,汽车属性在幕后确实有一个私人领域,而不是一个私人领域。
在理想的编程方案中,属性在外部公开时被声明为公共属性。
另一方面,字段是私有的,因为它们不应该被公开,因为当它们的值发生变化时,我们无法控制它们。另一方面,我们对属性有这样的控制。