其中是委托类中调用方法的声明

本文关键字:方法 声明 调用 | 更新日期: 2023-09-27 18:19:22

我试图挖掘委托类的声明 Invoke 方法,但我没有找到它!它到底在哪里?!!

要检查此条件,请复制以下代码:

public class Program
{
    public delegate void LogDel(string msg);
    private static void Main(string[] args)
    {
        var logger = new LogDel(Logger);
        var msg = "hi";
        logger.Invoke(msg);
        logger(msg);
    }
    public static void Logger(string logMsg)
    {
        Console.WriteLine(logMsg);
    }
}

其中是委托类中调用方法的声明

当您创建委托时,编译器在编译时生成一个继承MulticastDelegate的类,并向该类添加三个方法:BeginInvoke, EndInvokeInvoke。您可以使用using ILSpy和类似的工具轻松看到它。

这就是为什么你不能看到它,而在Delegate

MSDN必须这样说:

MulticastDelegate是一个特殊的类。编译器和其他工具可以从这个类派生,但不能显式地派生。Delegate类也是如此。

除了委托类型从MulticastDelegate继承的方法之外,公共语言运行库还提供了两个特殊的方法:BeginInvoke和EndInvoke。

MulticastDelegate有一个委托链表,称为调用列表,由一个或多个元素组成。当调用多播委托时,调用列表中的委托将按照它们出现的顺序同步调用。如果在列表执行期间发生错误,则抛出异常