C #: вернуть T из словаря, который сохраняет объекты - PullRequest
1 голос
/ 18 января 2011

Не является ли неэффективным использование для Dictionary<Type,object> вместо Dictionary<Type,T>?

Каждый раз, когда я добавляю ICustomerService, он упаковывается.

Если бы у меня был тип, 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)];
        }
}

Ответы [ 3 ]

1 голос
/ 18 января 2011

Каждый раз, когда я добавляю ICustomerService, он упаковывается.

Это было бы очень необычно.Только значения типа значения получают в штучной упаковке.Технически возможно иметь интерфейс struct .Но очень необычно для этого.Единственные накладные расходы, которые у вас есть, это актерский состав.Это очень быстро для ссылочного типа и довольно неизбежно по внешнему виду вашего фрагмента.

1 голос
/ 18 января 2011

Нет, при добавлении ICustomerService оно не будет упаковано, если ICustomerService не является типом значения, что было бы необычно. (Звучит как интерфейс.) Бокс происходит только с типами значений.

По сути, вы пытаетесь представить типовые отношения, которые не могут быть выражены в обобщениях. Бокс для типов значений (и проверок в других местах) - единственный способ обойти это. Вы не можете рассматривать словарь как другой тип словаря для каждого вызова, в зависимости от того, что означает T. Дженерики просто так не работают. Как вы ожидаете, что представление в памяти будет работать под капотом, с одним объектом (словарем), имеющим различное представление для каждого значения (без упаковки, как-то)?

0 голосов
/ 18 января 2011

Бокс происходит только при переключении между типом значения и эталоном.

Это означает, что в этом случае упаковка / распаковка происходит только тогда, когда объект имеет тип int, byte, char и т. Д.

ICustomerService - это интерфейс (я полагаю, из именования), поэтому это ссылочный тип. Бокса не происходит.

Вместо этого метод GetService выполняет приведение типов, которое не влияет на производительность, пока не будет переопределен оператор приведения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...