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

问题描述 投票:0回答:2

这个问题在这里已有答案:

我没有得到的是,

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

一般:

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; }
}
c# instance-variables
2个回答
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,以避免无限循环,虽然我觉得这可能是一个不好的做法,并且应该避免。

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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.