1

用 forDictionary<Type,object>代替不是无效Dictionary<Type,T>吗?

每次我添加一个 ICustomerService 它都会被装箱。

如果我有 Type,T 应该没有拳击,你怎么看?

public class MyService
{        
    private static Dictionary<Type, object> _services = new Dictionary<Type, object>();


        public static void AddService<T>(object service)
        {
            if (! (_services.ContainsKey(typeof(T))))
                _services.Add(typeof(T), service);
        }


        public static T1 GetService<T1>()
        {
            return (T1) _services[typeof(T1)];
        }
}
4

3 回答 3

1

ICustomerService不,当您添加一个除非ICustomerService是值类型时,它不会被装箱,这很不寻常。(这听起来像一个接口。)装箱只发生在值类型上。

基本上,您试图表示无法用泛型表达的类型关系。值类型的装箱(以及其他地方的检查)是解决此问题的唯一方法。您不能将字典视为每次调用的不同类型的字典,具体取决于是什么T。泛型根本不是那样工作的。您如何期望内存中的表示在引擎盖下工作,单个对象(字典)对每个值具有不同的表示(不知何故没有装箱)?

于 2011-01-18T14:54:38.583 回答
1

每次我添加一个 ICustomerService 它都会被装箱。

那将是非常不寻常的。只有值类型的值被装箱。技术上可以让结构实现接口。但这样做非常罕见。你在这里得到的唯一开销是演员表。这在引用类型上非常快,并且从您的代码段的外观来看是不可避免的。

于 2011-01-18T14:55:11.643 回答
0

只有在值类型和引用类型之间切换时才会发生装箱。

这意味着,在这种情况下,装箱/拆箱仅在对象类型为intbytechar等时发生。

ICustomerService是一个接口(我想从命名),所以它是一个引用类型。没有拳击发生。

相反,该GetService方法执行类型转换,在重写转换运算符之前不会影响性能。

于 2011-01-18T14:55:05.640 回答