为什么实例变量始终是私有的,而 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; }
}

为什么实例变量始终是私有的,而 auto 属性将它们设置为公共变量?还是一样

尽管您可以这样做,但想象一下使用此 API 并看到您有object.Nameobject.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,避免无限循环,尽管我觉得这可能是一个不好的做法,应该避免。

但重点是,汽车属性在幕后确实有一个私人领域,而不是一个私人领域。

在理想的编程方案中,属性在外部公开时被声明为公共属性。

另一方面,字段是私有的,因为它们不应该被公开,因为当它们的值发生变化时,我们无法控制它们。另一方面,我们对属性有这样的控制。