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

贝兰达

我不明白的是

我知道自动属性可以使事情变得容易。

一般:

private string name;

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

具有自动属性:

public string Name { get; set; }

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

那么这与以前的完全一样吗?

public string name;

public string Name
{
    get { return name; }
    set { name = value; }
}
奥斯汀·布赖恩

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

通常,公共领域被认为是不好的做法,因为您是在授予该类别的用户全部领域的权力。即使auto属性提供相同的功能,也可以更轻松地向setter或getter添加计算/过滤器,或者完全删除setter或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; }
}

因此,您可以看到,实际字段存在,但是每个人都无法访问它,因此它就像超级私有。但是,有时您可能不希望这样做。我碰到过几次,实际上我希望属性的类能够访问私有支持字段,以避免调用set和get,避免无限循环,尽管我觉得这可能是一个坏习惯,并且应该避免。

但要注意的是,汽车属性确实在幕后有一个私有字段,而不是其自身的私有字段。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么Java中的实例变量总是私有的?

为什么访问类的私有变量与访问结构的变量一样有效?

为什么一个Python对象的多个实例表现得好像它们一样?

为什么“ On Error”总是像键为null一样被触发?

为什么我的实例变量在AHK中像类变量一样起作用?

为什么我所有的分类准确率分数都一样?

Scala类型-为什么它们不一样?

为什么它们不一样?

为什么会出现错误:“ viewModel”是一个变量,但是却像“方法”一样使用?

为什么不能像变量一样覆盖管道?

为什么不是所有的flexbox元素都表现得像flexbox div一样?

CMake错误:此项目中使用了以下变量,但是将它们设置为NOTFOUND

为什么在只有一个应有的链表上进行合并时,总是将两个表都设置为NULL?

Java抽象类-实例变量是私有的还是受保护的?

下面的React代码有什么区别?哪一个最有效?还是它们几乎一样?

有没有办法像eclipse一样读取私有变量?

Keys vs shouldComponentUpdate,它们有什么关系,它们不一样吗?

为什么不能在一个朋友类中实例化其构造函数是私有的类?

为什么私有主页不是通过会话/登录变量私有的

为什么Windows总是使用与已安装RAM一样多的虚拟内存?

为什么变量总是设置为列表中的最后一项?

当 localStorage 为 null 时,为什么它仍然像有键和值一样工作?

为什么不一样?

为什么 __proto__ 是一样的

为什么将它设置为变量后只运行一次而不是两次?重击

Bash - 如何查找具有特定名称的文件并将它们设置为变量?

在 Python 中简化所有变量并将它们设置为 false

为什么我可以像调用实例方法一样调用类方法?

如何确定类属性是私有的还是公共的?