Tag: 私有成员

为什么私有成员变量可以被类实例更改?

class TestClass { private string _privateString = “hello”; void ChangeData() { TestClass otherTestClass = new TestClass(); otherTestClass._privateString = “world”; } } 这段代码在C#中编译,并且在PHP中等效,但有人可以解释为什么可以在这里更改otherTestClass._privateString的原因吗? 我原以为一个类的实例在任何情况下都不应该能够更改私有成员变量,并且尝试访问otherTestClass._privateString会导致“由于保护级别而无法访问”错误。 但事实并非如此,那么为什么在自己的类中实例化一个对象可以让你访问私有成员呢? 如果它,这不会破坏封装到一定程度? 还是我错过了一些明显的东西? (我不是在问上面的类设计是不是很好的做法,只是想知道它背后的理论。) 编辑 – 感谢您的回答和评论。 为了澄清,我也有兴趣知道能否做到这一点被认为是一个积极的function,或者它是否是更好的编译时检查/代码清晰度的必要权衡/因为大多数其他语言都是这样做或者其他什么。 在我看来,理想情况下编译器会阻止或警告你这个,但后来我远离语言设计师。 任何有关它如何通过这种方式的例子都可以让你做一些有用的事情(不会违反封装),否则很难或不可能。

私有字段的命名约定

首先,我知道这个问题之前已被问过几次,最后,这主要是个人偏好的问题,但是阅读关于这个主题的所有主题,有些事情对我来说并不清楚。 基本上,大多数人都同意的一点是,公共成员应该是PascalCased而私人成员应该是低级的.CamelCased。 通常引发争论的问题是是否用私人成员或其他任何东西作为私人成员的前缀。 前缀违反了几个StyleCop规则(显然可以关闭) 不加前缀的基本原理是你应该使用它。 改为加前缀。 我遇到的问题是我不明白它是如何产生影响的? 我的意思是,并不是说你不能在课堂上对公共成员使用这个。 让我们想象一下Customer类,看起来像这样: class Customer { private int age; public int Age { get { return this.age; } set { this.age = value; } } } (显然,在这么简单的情况下,我可以使用autoproperty,但这只是一个例子)。 如果我在这个类中添加了第二个属性,没有什么能阻止我使用this.Age(公共属性)而不是this.age(私有字段)来引用它。 有时候,如果在getter级别应用了一些validation或格式化,它甚至可以被发现。 此外,如果我的类的其他一些属性需要修改客户的Age,那么直接使用属性而不是后备字段是有意义的,因为setter也可以实现一些业务规则validation,对吧? 换句话说,我真的没有看到这个关键字如何避免私人支持成员和公共属性之间的混淆,因为这可以在两者上使用,而IntelliSense显示两者? 谢谢。

当C#在同一个包含的类中时,为什么以及如何允许访问类本身之外的私有变量?

我不知道这个问题是否足够描述,但为什么以及这种行为是如何存在的? public class Layer { public string Name { get; set; } private IEnumerable children; public IEnumerable Children { get { return this.children.Where ( c => c.Name != null ).Select ( c => c ); } set { this.children = value; } } public Layer ( ) { this.children = new List ( ); // […]