c# - 实例方法如何转换为委托(delegate)?

标签 c# .net delegates closures

在委托(delegate)中调用静态方法似乎很简单,因为它们的所有参数都将在调用委托(delegate)本身时传递给它们。
但是,当将实例方法添加到委托(delegate)时,“this”参数在委托(delegate)调用期间似乎被忽略了,因此我只能想象它与委托(delegate)本身一起保存——类似于闭包可以对其他对象执行的操作参数。

问:当实例方法被传递给委托(delegate)时,编译器是否会创建一个闭包,或者是否有不同的机制来完成?

最佳答案

没有。

Delegate 类有一个 Target 属性,它存储 this 的值以在调用方法时传递。
换句话说,Delegate 实际上存储了两个 东西:一个函数指针和第一个参数的值。

包含目标的委托(delegate)称为封闭委托(delegate),因为它关闭第一个参数。

事实上,这就是闭包的工作原理。当编译器为委托(delegate)创建闭包时,它会创建一个类来保存被关闭的变量,并将该类存储为委托(delegate)的Target

有关详细信息,请参阅我的博客文章:

关于c# - 实例方法如何转换为委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14092572/

相关文章:

c# - 按产品id获取数量总和

c# - 了解异步方法,这个例子会占用 CPU 时间吗?

c# - Process Stream类不支持写

.net - dotnet aspnetcore docker build 失败并显示 145 错误代码

c# - Wpf 图像控件(绑定(bind)到属性)第一次后不刷新

cocoa - delegate 类似于 mvc Controller 吗?

objective-c - 您应该在使用委托(delegate)的类中还是在类本身中将委托(delegate)设置为 nil

c# - 使用结构数组和大小参数索引编码(marshal) C# 结构

ios - UIApplicationProtectedDataWillBecomeUnavailable 通知 VS applicationProtectedDataWillBecomeUnavailable 委托(delegate)

.net - 如何解决 Failed to add reference to 'Microsoft.WITDataStore' ?