我尝试挖掘委托类以声明 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);
}
}
答案 0 :(得分:2)
创建委托时,编译器在编译时生成一个继承自MulticastDelegate
的类,向该类添加三个方法:BeginInvoke
,EndInvoke
和Invoke
。您可以使用 ILSpy 等来轻松查看。
这就是为什么在查看Delegate
类
这是MSDN所说的:
MulticastDelegate是一个特殊的类。编译器和其他工具可以从这个类派生,但你不能明确地从它派生。 Delegate类也是如此。
除了委托类型从MulticastDelegate继承的方法之外,公共语言运行库还提供了两种特殊方法:BeginInvoke和EndInvoke。
MulticastDelegate有一个委托链表,称为调用列表,由一个或多个元素组成。调用多播委托时,调用列表中的委托将按它们出现的顺序同步调用。如果在执行列表期间发生错误,则抛出异常