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修饰符来选择。隐私的直观含义是“访问” 仅限于包含类型
更进一步

8.5.3可访问性域

类型T中声明的嵌套成员M的可访问域 在程序中,P的定义如下(注意M本身可能 可能是一种类型):

  • 如果声明的M的可访问性是私有的,则M的可访问域是T的程序文本

  • 否则,如果M是私有的,则如果访问发生在声明M的类型中,则允许访问
  • 否则,类型或成员将不可访问,并发生编译时错误

因此,尽管能够访问方法中的私有成员(当您只能访问引用时)似乎违反直觉,但它本身仍然是封装的(尽管您可能会反对该定义),和可访问的

为什么您认为它破坏了封装?通过创建公共方法和属性,您创建了公共表面区域。其他代码可以使用这些公共表面区域与
计数器
类交互。如果您的公共方法/属性更改任何不会违反封装原则的私有字段。封装n将一个或多个项(数据成员和方法)封装在一个物理或逻辑包中,而c#是一个类。请选中此项。我明白了,请将此项加粗:您可以访问定义它的类型内的私有字段。