静态generics类作为字典
通用类中的静态字段对于每个通用参数组合都会有一个单独的值。 因此它可以用作Dictionary <Type, whatever >
这是比静态字典<types, 什么 >更好或更差?
换句话说,这些实现中的哪一个更高效?
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如何通过genericstypes参数查找静态字段?
我喜欢用这种方式使用generics。 特别是,我经常为了这个目的而使用私有的嵌套generics类。
我喜欢的主要的事情是很难不以这种方式获得初始化(就线程安全性而言),给出了types初始化的工作方式。 唯一的问题是如果初始化失败怎么办 – 偶尔我会诉诸记住一个例外来抛出第一次必要的访问,但这是非常罕见的。
我不想猜测CLR 究竟是如何通过types参数来查找types的,但是我相当肯定它会被优化以便回滚:)
我还没有对其进行分析(这是真正回答这个问题的唯一方法 – 性能差异可能太小而没有意义),但是我猜测locking是昂贵的部分。 CLR确实为你做了locking – 并且以这个领域的专家定义的方式来做! – 所以我期望如果有差异,它会赞成使用语言function,而不是使用Dictionary
+locking自己构build它。
它不会为每个genericstypes参数存储值,因为它实际上创build了N个不同的类 – 一个用于您使用的每个typesT.
我相信通用的(第一个)版本会在编译时进行字典查找,因此在运行时性能会更好。
但是,它可能会使用更多的内存。