gpt4 book ai didi

c# - 委托(delegate)如何工作(在后台)?

转载 作者:太空狗 更新时间:2023-10-29 18:11:35 24 4
gpt4 key购买 nike

委托(delegate)在幕后如何在 c# 中工作以及如何有效地使用它们?

编辑:我知道它们在表面上是如何工作的(它们基本上是函数指针,并允许使用它们的地址调用具有特定签名的回调方法)。我需要知道的是 CLR 实际上是如何在内部实现它们的。当您定义委托(delegate)以及使用委托(delegate)对象调用回调方法时,幕后到底发生了什么?

最佳答案

再效率 - 不清楚您的意思,但它们可用于通过避免昂贵的反射来实现效率。例如,通过使用 Delegate.CreateDelegate 为动态/查找方法创建(类型化)预检查委托(delegate),而不是使用(较慢的)MethodInfo.Invoke.

对于一个简单的示例(访问类型的静态 T Parse(string) 模式),请参见下文。请注意,它只使用一次反射(每种类型),而不是很多次。这应该优于反射或典型的 TypeConverter 用法:

using System;
using System.Reflection;
static class Program { // formatted for space
static void Main() {
// do this in a loop to see benefit...
int i = Test<int>.Parse("123");
float f = Test<float>.Parse("123.45");
}
}
static class Test<T> {
public static T Parse(string text) { return parse(text); }
static readonly Func<string, T> parse;
static Test() {
try {
MethodInfo method = typeof(T).GetMethod("Parse",
BindingFlags.Public | BindingFlags.Static,
null, new Type[] { typeof(string) }, null);
parse = (Func<string, T>) Delegate.CreateDelegate(
typeof(Func<string, T>), method);
} catch (Exception ex) {
string msg = ex.Message;
parse = delegate { throw new NotSupportedException(msg); };
}
}
}

关于c# - 委托(delegate)如何工作(在后台)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/527489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com