静态泛型类的词典

在泛型类的静态字段对泛型参数的每个组合的独立价值。 因此,它可以用作一个字典<类型无论>

这是不是一个静态的字典更好或更坏<类型, 无论 >?

换句话说,这些实施方式更有效的?

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查找静态字段由泛型类型参数?

--------------解决方案-------------

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

主要的事情,我喜欢它是,它很难不得到正确初始化这种方式(在线程安全方面),给出的方法类型初始化工作。 唯一的问题是怎么做,如果初始化失败 - 偶尔我使出记住一个例外扔在第一次必要的访问,但是这是非常罕见的。

我不想猜测通过类型参数的CLR 究竟是如何查找的类型,但我敢肯定它会进行优化,以赫克和背部:)

我没有异形它(这是真的回答这个问题的唯一办法 - 在性能上的差异可能是如此小,是毫无意义的),但我会大胆地猜测,锁定是昂贵的部分。 在CLR确实做到锁定为你 - 这样做,通过这方面的专家定义的一种方式! -所以我预计,如果是有区别的,这将是赞成使用的语言特性,而不是建立它自己的Dictionary +锁定。

它不存储值为每个泛型类型参数一样,因为它真正的创造(概念反正)N不同的类 - 一个用于您使用它与每个类型T。

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

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

分类:C# 时间:2012-01-01 人气:0
分享到:

相关文章

  • 如何初始化包含字典列表字典? 2012-08-30

    我开始做在C#中一点点发展,我坚持的一个问题在这里. 通常我在Python开发的地方像这样的东西被很容易实现(至少对我来说),但我不知道该怎么做,在C#: 我想创建一个包含类似下面的使用泛型集合词典列表的词典: { "alfred", [ {"age", 20.0}. {"height_cm", 180.1} ], "barbara", [ {"age", 18.5}, {"height_cm&q

  • 泛型列表或不同类型的词典 2012-01-07

    我想有一个映射字符串类型多样泛型列表的字典. 即如下形式: 核心价值字符串列表<T>字符串列表<U>字符串列表<V>字符串列表<U> ... 目前我使用的是Dictionary<string, IList>然后提取每个词典中的强类型列表KeyValuePair<string, IList> pair条目,如下所示: Type layerType = pair.Value.GetType().GetGenericArguments()[

  • 使用CLR泛型语法继承属性asp.net mvc的观点 2012-10-23

    至于原因,我不会进入我需要使用CLR泛型语法在ASP.NET MVC视图. 即不是这样的: System.Web.Mvc.ViewUserControl<someobject> 但是这: System.Web.Mvc.ViewUserControl`1[[someobject]] 当我运行的应用程序 Parser Error: could not load type `System.Web.Mvc.ViewUserControl`1[[someobject]]` :( 我怎样才能得到这个工作?

  • 为什么我不能用C#语法中的继承属性为封闭式泛型,但CLR的语法是罚款 2012-07-28

    下面的CLR语法在我的aspx页面正常工作: <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="Website.MyBasePage`1[HomePageViewModel]" %> 但这个C#语法并不: <%@ Page Language="C#" MasterPageFile="~/Views

  • 如何合并不同类型的/ ZIP泛型列表(并将结果转换到词典)? 2012-09-09

    我需要一些Excel工作表中读取数据. 在Excel工作表中的数据已经被格式化了,我能够使用这种方法来获得所需数据的方式. 这是我在做什么: using (var conn = new OleDbConnection(strBld.ToString())) { conn.Open(); IEnumerable<IDictionary<string, object>> excelDataRaw = conn.Query("select * from [Curves$A:IT

  • 从C#泛型词典过滤出来的值 2012-07-28

    我有一个C#字典, Dictionary<Guid, MyObject>我需要的基础上的财产被过滤MyObject 例如,我希望所有的记录从字典,以消除MyObject.BooleanProperty = false 什么是acheiving本的最佳方法是什么? --------------解决方案------------- 因为字典实现IEnumerable<KeyValuePair<Key, Value>>你可以只使用其中: var matches = dictio

  • 与使用.NET泛型/词典的帮助更换我的数组 2012-09-02

    Mypage.cs string[] strParameterName = new string[2] {"?FirstName", "?LastName"}; string[] strParameterValue = new string[2] {"Josef", "Stalin"}; MyConnection.MySqlLink(strConnection, strCommand, strParameterName, st

  • .NET转换简单数组列出泛型 2012-01-25

    这个问题似乎微不足道,也是愚蠢的第一眼,但它远不止此. 我有任何类型的数组T T[]我想将其转换成一个List泛型( List<T> 是否有任何其他方式除了创建一个通用的列表,遍历整个数组,并添加在列表中的元素? 现状: string[] strList = {"foo","bar","meh"}; List<string> listOfStr = new List<string>(); foreach(str

  • 为什么不能C#泛型从泛型类型参数之一派生像他们可以在C ++模板? 2012-02-13

    这个问题已经有了答案在这里: 继承上约束泛型类型参数3回答 为什么不能C#泛型从泛型类型参数之一派生像他们可以在C ++模板? 我的意思是我知道这是不可能的,因为CLR不支持这一点,但为什么呢? 我知道C ++模板和C#泛型之间的深刻分歧 - 前者是编译时的实体,必须在编译过程中得到解决,而后者则是一流的运行时间实体. 不过,我没有看到为什么CLR的设计者并没有拿出一项计划,将最终使CLR泛型类型从它的泛型类型参数之一派生的原因. 毕竟,这将是相当有用的功能,我个人错过了极大. 编辑: 我想知道

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.472 (s). 10 q(s)