How delegates work (in the background)?(代表如何工作(在后台)?)
问题描述
委托在 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); };
}
}
}
这篇关于代表如何工作(在后台)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:代表如何工作(在后台)?
基础教程推荐
- 经典 Asp 中的 ResolveUrl/Url.Content 等效项 2022-01-01
- 错误“此流不支持搜索操作"在 C# 中 2022-01-01
- 是否可以在 asp classic 和 asp.net 之间共享会话状态 2022-01-01
- 从 VS 2017 .NET Core 项目的发布目录中排除文件 2022-01-01
- 将事件 TextChanged 分配给表单中的所有文本框 2022-01-01
- 首先创建代码,多对多,关联表中的附加字段 2022-01-01
- 在 VS2010 中的 Post Build 事件中将 bin 文件复制到物 2022-01-01
- JSON.NET 中基于属性的类型解析 2022-01-01
- 如何动态获取文本框中datagridview列的总和 2022-01-01
- 全局 ASAX - 获取服务器名称 2022-01-01
