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

时间:2016-02-16 04:37:10

标签: c# instance-variables

我没有得到的是,

我知道自动财产可以让事情变得更容易。

通常:

private string name;

public string Name
{
    get { return name; }
    set { name = value; }
}

使用自动属性:

public string Name { get; set; }

但是如果我们可以将实例变量声明为public,就像在auto属性中一样,为什么我们不将普通版本中的实例变量声明为public?

那么这与之前的完全相同吗? :

public string name;

public string Name
{
    get { return name; }
    set { name = value; }
}

2 个答案:

答案 0 :(得分:2)

尽管您可以这样做,但想象一下使用此API并看到您拥有object.Nameobject.name。你怎么知道使用哪一个?

通常,公共字段被认为是不好的做法,因为您将该类的用户赋予了字段的全部权限。即使auto属性提供相同的功率,也可以更容易地将计算/过滤器添加到setter或getter,或者完全删除setter或getter。

通过公开支持字段,您可以让用户完全忽略您设置的任何验证。

我想你可能会在这里感到困惑。

正如您在this sharplab.io example中看到的那样,

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; }
}

所以你可以看到,实际的领域存在,但是每个人都无法访问,所以它就像超私有。但是,有时你可能不想要这个。我曾经遇到过几次我实际上希望属性的类能够访问私有支持字段以避免调用set和gets,以避免无限循环,尽管我觉得这可能是一个不好的做法,并且应该避免。

但重点是,自动属性在幕后确实有私有字段,而不是私有字段。

答案 1 :(得分:0)

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

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