代码之家  ›  专栏  ›  技术社区  ›  SLaks

静态泛型类作为字典

  •  16
  • SLaks  · 技术社区  · 16 年前

    泛型类中的静态字段对于泛型参数的每个组合都有一个单独的值。因此,它可以用作词典<类型 &燃气轮机;

    这比静态词典好还是坏<类型 >?

    换句话说,这些实现中哪一个更有效?

    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 回复  |  直到 7 年前
        1
  •  13
  •   Jon Skeet    16 年前

    我喜欢这样使用泛型类型。特别是,我经常使用私有嵌套泛型类来实现这一目的。

    我最喜欢的是它很难 为了以这种方式正确初始化(就线程安全而言),给定类型初始化的工作方式。唯一的问题是初始化失败时该怎么办——有时我会记住一个异常来引发第一次必要的访问,但这种情况非常罕见。

    确切地 CLR是如何通过类型参数查找类型的,但我很确定它会被优化为检查和返回:)

        2
  •  2
  •   SLaks    16 年前

    我相信泛型(第一个)版本将在编译时执行字典查找,因此在运行时执行得更好。

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

        3
  •  2
  •   Daniel Earwicker    16 年前

    我还没有分析过它(这是真正回答这个问题的唯一方法——性能上的差异可能很小,以至于毫无意义),但我会冒险猜测,锁定是最昂贵的部分。CLR会为您执行锁定,并且会以该领域专家定义的方式执行锁定因此,我希望如果有差异,它将有利于使用语言功能,而不是自己构建它 Dictionary +锁定。

        4
  •  1
  •   Eric Petroelje    16 年前