我目前正在研究 C# 中的 Delegate 类的文档,并且遇到了一些让我困惑的术语。我对 C 函数指针和 C++ lambda 等委托的概念有一个概念性的理解,我正在尝试了解 C# 中的细节
文档中的具体行/术语以及与其相关的问题列出如下:
委托是委托类型的实例,它引用:
- 类型的实例方法和可分配给该类型的目标对象。(强调我的)
我理解实例方法部分。例如:
FooDelegateType foo = FooInstanceMethod;
“以及可分配给该类型的目标对象”是什么意思?在上面的示例中,目标对象是否引用包含
FooInstanceMethod
定义的类型的特定实例?
下一个:
- 类型的实例方法,在形式参数列表中公开隐藏的 this 参数(强调我的)。该委托据说是一个开放实例委托。
我很难想象这意味着什么。这是否意味着实例方法有一个显式的“this”参数,如下所示:
public class Foo {
public void FooMethod(Foo this) { // do thing }
}
我怀疑上面的示例是您正式公开隐藏的“this”参数的方式。这是如何正确完成的?
第三:
静态方法。
一切都清楚了,没有问题。
第四:
静态方法和可分配给该方法的第一个参数的目标对象。(强调我的)
与我的第一个问题类似,可分配给第一个参数的目标对象是什么。从语法上来说,它会是什么样子?
最后:
当委托表示对其第一个参数封闭的实例方法(最常见的情况)时,委托存储对方法入口点的引用和对称为目标的对象的引用,该对象的类型可分配给该类型定义了方法
“实例方法对其第一个参数关闭”是什么意思。
谢谢!
类型的实例方法和可分配给该类型的目标对象。 (强调我的)
这意味着委托代表可调用的实例函数。例如:
Delegate myDel = new Foo().Do; // delegate needs to store instance and method to be called on the instance
class Foo
{
public void Do()
{
}
}
这是否意味着实例方法有一个显式的“this”参数,如下所示:
不,这意味着由于所有实例方法都有隐式
this
参数,您可以创建一个开放实例委托:
delegate void OpenInstDel(Foo p);
Delegate del = typeof(Foo).GetMethod(nameof(Foo.Do)).CreateDelegate(typeof(OpenInstDel));
del.DynamicInvoke(new Foo());
// or
var del1 = (OpenInstDel)typeof(Foo).GetMethod(nameof(Foo.Do)).CreateDelegate(typeof(OpenInstDel));
del1(new Foo());
静态方法和可分配给该方法的第一个参数的目标对象。 (强调我的)
这与上一篇类似:
var str = "qweeqwe";
Delegate closedStatic = typeof(Foo).GetMethod(nameof(Foo.DoString), BindingFlags.Public | BindingFlags.Static)
.CreateDelegate<Action>(str);
closedStatic.DynamicInvoke();