You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 11:15:03