为什么C#编译器允许在运算符方法中访问对象的private字段?
问题背景
你定义的示例代码如下:
class Foo { private int _value; public static int operator +(Foo foo1, Foo foo2) { return foo1._value + foo2._value; } }
原因说明
private修饰符的访问控制是类级别,而非实例级别:C#(以及Java、C++等主流面向对象语言)中,private限制的是类外部代码对成员的访问,只要代码编写在目标成员所属类的内部,不管访问的是当前实例的私有成员,还是同一个类其他实例的私有成员,都是完全合法的。- 你定义的加法运算符重载是
Foo类的静态成员,本身属于Foo的类内代码,因此可以直接访问任意Foo类型实例的私有字段_value,传入的参数foo1、foo2也属于Foo类型实例,自然符合访问权限要求。 - 这种设计是面向对象封装特性的合理实现:同类实例交互(比如运算、比较、克隆等场景)时,不需要额外编写公共接口暴露内部字段,同时也不会破坏私有成员的封装性,因为类外代码依然无法直接访问私有成员。
内容的提问来源于stack exchange,提问作者Nigel
相关产品推荐
相关产品推荐

