一个委托中的所有方法是否都被平等对待,或者其中一些是特殊的

本文关键字:或者 一个 是否 有方法 | 更新日期: 2023-09-27 18:13:51

我最近了解到委托不是指向一个函数的指针,而是指向一个函数列表(称为"调用列表")。我想知道列表中的方法之间是否有任何区别:是其中一个,还是其中几个,在某种程度上特别?它们中的一些是否存储在调用列表之外的其他地方?

我问,因为我在MSDN文档(https://msdn.microsoft.com/en-us/library/system.delegate.method(v=vs.110).aspx)中发现了一个属性Delegate.Method,它说

委托。方法属性:

获取委托表示的方法。

假设在委托中存储的所有方法都被平等对待,我不清楚它们指的是哪个方法。很可能他们指的是第一个,但这只是一种猜测。有人知道吗?

一个委托中的所有方法是否都被平等对待,或者其中一些是特殊的

刚刚测试过:

public class Program
{
    public delegate int Operation(int x, int y);
    public static int Add(int x, int y)
    {
        return x+y;
    }
    public static int Sub(int x, int y)
    {
        return x-y;
    }
    public static void Main()
    {
        Operation o = new Operation(Add);
        o += Sub;
        Console.WriteLine(o.Method);
    } 
}

输出是最后一个赋值的方法:

Int32 Sub(Int32, Int32)

尽管Method属性将返回最后一个方法,但它并没有区别对待它,也没有特殊于其他方法(除了这是添加到委托的最后一个方法,并且根据@Dennies_E注释,如果委托返回任何值,它将是最后一个方法返回值,在这种情况下,子方法返回值)。

如果你想看到所有的赋值方法,你可以使用Delegate。GetInvocationList方法:

foreach(Opeartion operation in o.GetInvocationList())
{
    Console.WriteLine(operation.Method);
}

这将按照添加的顺序打印所有的方法:

Int32 Add(Int32, Int32)

Int32 Sub(Int32, Int32)

相关文章: