C# 委托类文档中“实例方法对其第一个参数关闭”是什么意思

问题描述 投票:0回答:1

我目前正在研究 C# 中的 Delegate 类的文档,并且遇到了一些让我困惑的术语。我对 C 函数指针和 C++ lambda 等委托的概念有一个概念性的理解,我正在尝试了解 C# 中的细节

文档中的具体行/术语以及与其相关的问题列出如下:

委托是委托类型的实例,它引用:

  • 类型的实例方法和可分配给该类型的目标对象。(强调我的)

我理解实例方法部分。例如:

FooDelegateType foo = FooInstanceMethod;

“以及可分配给该类型的目标对象”是什么意思?在上面的示例中,目标对象是否引用包含

FooInstanceMethod
定义的类型的特定实例?

下一个:

  • 类型的实例方法,在形式参数列表中公开隐藏的 this 参数(强调我的)。该委托据说是一个开放实例委托。

我很难想象这意味着什么。这是否意味着实例方法有一个显式的“this”参数,如下所示:

public class Foo {
    public void FooMethod(Foo this) { // do thing }
}

我怀疑上面的示例是您正式公开隐藏的“this”参数的方式。这是如何正确完成的?

第三:

静态方法。

一切都清楚了,没有问题。

第四:

静态方法和可分配给该方法的第一个参数的目标对象。(强调我的)

与我的第一个问题类似,可分配给第一个参数的目标对象是什么。从语法上来说,它会是什么样子?

最后:

当委托表示对其第一个参数封闭的实例方法(最常见的情况)时,委托存储对方法入口点的引用和对称为目标的对象的引用,该对象的类型可分配给该类型定义了方法

“实例方法对其第一个参数关闭”是什么意思。

谢谢!

c# delegates
1个回答
0
投票

类型的实例方法和可分配给该类型的目标对象。 (强调我的)

这意味着委托代表可调用的实例函数。例如:

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();
© www.soinside.com 2019 - 2024. All rights reserved.