C# 调用方法以及直接读取/设置参数的私有字段是否会破坏封装?
考虑以下代码:C# 调用方法以及直接读取/设置参数的私有字段是否会破坏封装?,c#,class,oop,C#,Class,Oop,考虑以下代码: public class Counter { private int _value; // public int Value => _value; // commented for asking purposes public void Increment() { _value++; } public void Decrement() { _value--; } publ
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,通过在成员声明中包含Private修饰符来选择。隐私的直观含义是“访问” 仅限于包含类型
- 如果声明的M的可访问性是私有的,则M的可访问域是T的程序文本
- 否则,如果M是私有的,则如果访问发生在声明M的类型中,则允许访问
- 否则,类型或成员将不可访问,并发生编译时错误
因此,尽管能够访问方法中的私有成员(当您只能访问引用时)似乎违反直觉,但它本身仍然是封装的(尽管您可能会反对该定义),和可访问的为什么您认为它破坏了封装?通过创建公共方法和属性,您创建了公共表面区域。其他代码可以使用这些公共表面区域与
计数器
类交互。如果您的公共方法/属性更改任何不会违反封装原则的私有字段。封装n将一个或多个项(数据成员和方法)封装在一个物理或逻辑包中,而c#是一个类。请选中此项。我明白了,请将此项加粗:您可以访问定义它的类型内的私有字段。