考虑以下代码:
public class Counter
{
private int _value;
// public int Value => _value;
// commented for asking purposes
public void Increment() {
_value++;
}
public void Decrement() {
_value--;
}
public void CopyOtherCounter(Counter other)
{
_value = other._value;
// the compiler didn't show any error here
// why it does not break encapsulation?
}
}
我想问一下这是否意味着破坏封装。
编辑:因为我想我不能读取其他对象的私有值,即使它具有相同的类型。因为这可能发生:
public class Person {
private float _walletMoney; // no getter
private void StealFrom(Person other) {
_walletMoney += other._walletMoney; //reading other private wallet
other._walletMoney = 0; //writing other private wallet
}
}
void Main() {
var John = new Person();
var Bob = new Person();
John.StealFrom(Bob);
}
在面向对象的编程(OOP)中,封装是指将数据与对数据进行操作的方法捆绑在一起,或限制对对象某些组件的直接访问
根据定义,它仍然是封装的,位于类型内,并且具有非常特定的可访问性域!
简单地说,您可以访问定义它的类型内的私有字段,其中还包括嵌套的类型/类(即使您正在处理对类型的引用),因此(并由规范定义)是允许的。
要获取有关此内容的特定文档,您确实必须深入了解C#规范,您可以在此处找到
这是重要的部分
8.5.2声明的可访问性
...
- 私有,通过在成员声明中包含私有修饰符来选择。private的直观含义是“访问仅限于包含类型
更进一步
8.5.3可访问性域
...
程序P中以类型T声明的嵌套成员M的可访问域定义如下(请注意,M本身可能是类型):
...
- 如果声明的M的可访问性是私有的,则M的可访问域是T的程序文本。
...
- 否则,如果M是私有的,则允许访问,如果它发生在声明M的类型之内。
- 否则,将无法访问类型或成员,并且会发生编译时错误。
因此,即使它似乎违反直觉的是能够访问私有成员一中方法(当你只能访问一个参考),它仍然封装本身(虽然你可能反对的定义),以及访问
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句