泛型类中的静态字段对于每个泛型参数组合都有一个单独的值。因此,它可以用作词典< Type,无论>
这比静态字典更好还是更差?<类型,无论>?
换句话说,哪些实现更有效?
public static class MethodGen<TParam> {
public static readonly Action<TParam> Method = CreateMethod();
static Action<TParam> CreateMethod() { /*...*/ }
}
或者,
public static class MethodGen {
static readonly Dictionary<Type, Delegate> methods
= new Dictionary<Type, Delegate>();
public static Action<T> GetMethod<T>() {
//In production code, this would ReaderWriterLock
Delegate method;
if(!methods.TryGetValue(typeof(T), out method)
methods.Add(typeof(t), method = CreateMethod<T>());
return method;
}
static Action<T> CreateMethod<T>() { /*...*/ }
}
特别是,CLR如何通过泛型类型参数查找静态字段?
答案 0 :(得分:13)
我喜欢这种方式使用泛型类型。特别是,我经常有私有嵌套泛型类用于此目的。
我最喜欢的是,在给定类型初始化的方式的情况下,以这种方式(在线程安全性方面)以正确的方式获取初始化很难 。唯一的问题是如果初始化失败该怎么办 - 偶尔我会使用记住异常来获得第一次必要的访问权限,但这种情况非常罕见。
我不想猜测完全 CLR如何通过类型参数查找类型,但我很确定它会被优化为heck and back:)
答案 1 :(得分:2)
我没有对它进行分析(这是真正回答这个问题的唯一方法 - 性能上的差异可能很小而没有意义)但我猜测锁定是昂贵的部分。 CLR会为您执行锁定 - 并且以此领域专家定义的方式执行此操作! - 所以我希望如果存在差异,那么支持使用语言功能而不是使用Dictionary
+锁定自己构建它。
答案 2 :(得分:1)
它不存储每个泛型类型参数的值,就像它真正创建的那样(概念上无论如何)N个不同的类 - 每个类型对应一个用于它的类型。
答案 3 :(得分:1)
我相信通用(第一个)版本会在编译时进行字典查找,因此在运行时表现更好。
但是,它可能会占用更多内存。