问题描述
委托在 C# 中如何在幕后工作以及如何有效地使用它们?
How do delegates work in c# behind the scenes and how can they be used efficiently?
我知道它们在表面上是如何工作的(它们基本上是函数指针,并允许使用它们的地址调用具有某些签名的回调方法).我需要知道的是 CLR 如何在内部实际实现它们.当您定义委托以及使用委托对象调用回调方法时,幕后究竟发生了什么?
I know how they work on the surface(they are basically function pointers and allow callback methods with certain signatures to be invoked using their address). What I need to know is how the CLR actually implements them internally. What exactly happens behind the scenes when you define a delegate and when you invoke a callback method using the delegate object?
推荐答案
Re 效率 - 不清楚你的意思,但它们可以通过避免昂贵的反射来实现效率.例如,通过使用 Delegate.CreateDelegate
为动态/查找方法创建(类型化的)预检查委托,而不是使用(较慢的)MethodInfo.Invoke
.
Re efficiency - it isn't clear what you mean, but they can be used to achieve efficiency, by avoiding expensive reflection. For example, by using Delegate.CreateDelegate
to create a (typed) pre-checked delegate to a dynamic/looked-up method, rather than using the (slower) MethodInfo.Invoke
.
对于一个简单的示例(访问类型的静态 T Parse(string)
模式),请参见下文.请注意,它只使用一次反射(每种类型),而不是很多次.这应该优于反射或典型的 TypeConverter
用法:
For a trivial example (accessing the static T Parse(string)
pattern for a type), see below. Note that it only uses reflection once (per type), rather than lots of times. This should out-perform either reflection or typical TypeConverter
usage:
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); };
}
}
}
这篇关于代表如何工作(在后台)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!