静态泛型类作为字典

时间:2009-03-26 16:50:13

标签: c# .net generics dictionary clr

泛型类中的静态字段对于每个泛型参数组合都有一个单独的值。因此,它可以用作词典< 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如何通过泛型类型参数查找静态字段?

4 个答案:

答案 0 :(得分:13)

我喜欢这种方式使用泛型类型。特别是,我经常有私有嵌套泛型类用于此目的。

我最喜欢的是,在给定类型初始化的方式的情况下,以这种方式(在线程安全性方面)以正确的方式获取初始化很难 。唯一的问题是如果初始化失败该怎么办 - 偶尔我会使用记住异常来获得第一次必要的访问权限,但这种情况非常罕见。

我不想猜测完全 CLR如何通过类型参数查找类型,但我很确定它会被优化为heck and back:)

答案 1 :(得分:2)

我没有对它进行分析(这是真正回答这个问题的唯一方法 - 性能上的差异可能很小而没有意义)但我猜测锁定是昂贵的部分。 CLR会为您执行锁定 - 并且以此领域专家定义的方式执行此操作! - 所以我希望如果存在差异,那么支持使用语言功能而不是使用Dictionary +锁定自己构建它。

答案 2 :(得分:1)

它不存储每个泛型类型参数的值,就像它真正创建的那样(概念上无论如何)N个不同的类 - 每个类型对应一个用于它的类型。

答案 3 :(得分:1)

我相信通用(第一个)版本会在编译时进行字典查找,因此在运行时表现更好。

但是,它可能会占用更多内存。

相关问题