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

C#委托上下文绑定原理:为何委托可访问类的成员字段?

C#委托调用访问原类字段的原理解答

问题背景

我是C#初学者,正在学习委托相关知识,编写了如下测试代码:

internal class Class1
{
    string name = "John";
    int age = 19;
        
    public void printName() => Console.WriteLine(this.name + " " + this.age);
}
        
internal class Class2
{
    public delegate void speaker();
    private speaker? _myDelegate;
    public void addDelegate(speaker deleg) => _myDelegate = deleg;
        
    public void wrapper()
    {
      Console.WriteLine("This is a message from Class2");
      _myDelegate.Invoke();
    }
}
    
Class1 A = new Class1();
Class2 B = new Class2();
B.addDelegate(A.printName);
B.wrapper();

想请教:通过委托调用该方法时,它为何仍能访问原类(Class1)的所有数据字段(作用域)?

核心原因

当你将A.printName赋值给委托时,这个委托实际上是把实例方法和所属的对象A绑定在了一起,具体细节如下:

  • 实例方法的执行依赖于所属的对象实例,this关键字在方法内部始终指向这个实例。委托在保存方法信息的同时,还会存储该方法对应的实例引用(也就是对象A)。
  • 当调用_myDelegate.Invoke()时,CLR会使用委托中保存的对象A的引用去执行printName方法,这和你直接调用A.printName()的逻辑完全一致。
  • 另外,printName本身就是Class1的成员,不管通过什么方式调用(直接调用或委托调用),它都有权访问Class1内部的所有字段——哪怕是未加访问修饰符的默认私有字段,这是类成员的访问权限规则决定的。

简单总结:委托不是单独存一个方法,而是把方法和它的“宿主对象”打包在一起,所以调用时能正常访问该对象的所有成员。

内容的提问来源于stack exchange,提问作者Oleg Chaika

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:30:52