2012-05-12 2 views
-2

Мне нужно сохранить несколько значений в списке или массиве на мгновение. Эти значения нескольких типов как строки, межды, дата и время и т.д.Список/массив значений с несколькими различными типами

У меня есть два варианта:

Варианта 1:

Объявите массив с типом объекта, как это:

object[] values; 

Вариант 2:

Объявить массив для интерфейса и реализовать собственные классы для хранения каждого типа.

interface IType 
{ 
} 

IType[] values; 

class StringValue : IType 
{ 
    public string StringValue { get; set; } // not declared in interface! 
} 

class IntValue : IType 
{ 
    public int IntValue { get; set; } // not declared in interface! 
} 

Вопрос:

Какие выгоды производительности и/или последствия для каждого из вариантов реализации? Насколько я знаю (или желаю), boxinq имеет собственное влияние на производительность при использовании object[].

Как насчет варианта два? По крайней мере, с помощью StringValue или IntValue недвижимости требуется больше кода, первый тип должен быть определен, IType должен быть преобразован в StringValue или IntValue и т.д. ...

Есть так большое влияние на производительность с помощью object[], что я действительно должен думать о чем-то вроде варианты 2?

+3

Перед тем, как беспокоиться о производительности, КОГДА-ЛИБО, просто реализуйте и записывайте свой код, а ТЕСТ ТЕСТ ТЕСТ, и посмотрите, есть ли проблема с производительностью, тогда вы можете оптимизировать **, если необходимо ** –

+0

Конечно! Я уже реализовал опции 1, и потому что знаю (не оценил!), Будут некоторые проблемы, я просто думаю, как я могу улучшить свой код. Может быть, вопрос в том, чтобы больше узнать, что может быть лучше, чем варианты 1 .... – Harza

+0

Просить «лучше» не поможет - вам нужно уточнить, в каком смысле. – Oded

ответ

1

Класс IntValue Вы предлагаете по существу ящики целого числа ... он инкапсулирует его в объект, чтобы он мог участвовать в объекте []. Я бы не ожидал улучшения с этим сценарием, и в зависимости от вашей реализации это может быть хуже, чем укомплектованный компилятором бокс.

Сказав это, я согласен с комментаторами в том, что ваши усилия, вероятно, лучше сосредоточены на улучшении других областей вашего кода. Существует очень мало сценариев, где накладные расходы бокса будут самой важной областью внимания.

Я столкнулся с сценарием (работа с множеством чисел, которые могут быть int, float или double), где бокс имел значение для пользователя. Я решил, что using expression trees.

+0

Единственное преимущество этой модели интерфейса заключается в том, что вы гарантируете, что в массиве могут быть только 'ints',' strings', 'datetimes' или другие классы, реализующие интерфейс (который, если он является внутренним, будет известной конечной суммой). Если вы используете 'object', это действительно может быть что угодно. – Servy

+0

Правда, но с другой стороны, интерфейс имеет один член для каждого типа. Это не интерфейс в обычном смысле (один интерфейс для нескольких реализаций). Можно также получить общий тип базы, чтобы получить эту выгоду. –

+0

Спасибо за ответ. Я также нашел это http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/808ad927-385f-49c9-aace-256eefe659d7 – Harza

0

Не думаю, что это сильно влияет на производительность. Отражение, используемое для поиска типа объекта, может немного замедлить его, если вы используете объект [] _объекты. Функция .GetType().