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
相关产品推荐
相关产品推荐

