2013-03-20 4 views
-5

Можно ли, чтобы сделать что-то вроде этого:Может ли ArrayList в C# содержать объекты разных типов?

ArrayList arl = new ArrayList(); 
arl.Add(1); 
arl.Add("test"); 

int[,] tab = new int[4, 4]; 
init(tab); 

arl.Add(tab); 

Можно ли содержать объекты различных типов (как в JavaScript или Lua)? (C#)

+0

Это дает ошибку компиляции?'ArrayList' содержит объекты –

+0

попытайтесь запустить, чтобы увидеть, как компилятор C# реагирует –

+0

Вы пытались хотя бы один раз? Я не вижу никаких усилий здесь .. –

ответ

1

Да, ArrayList содержит элементы типа объекта, так это означает, что вы можете положить все, что в нем. Когда вы снова загрузите его, вы можете вернуть его обратно к исходному типу. Конечно, из-за этого литья он менее эффективен.

0

Да, это возможно. ArrayList хранит коллекцию типа object, что означает, что вы можете вставить любой тип .NET.

Вы должны действительно использовать List<T>. Например:

List<int> listIntegers = new List<int>(); 
listIntegers.Add(1); 

Вы также можете использовать List<object> однако вам придется распаковывать все элементы в списке. Что потенциально может вызвать проблемы с производительностью.

+2

@Downvoter - прокомментировать? –

+0

Здесь нет оснований понижать, так что да, почему нисходящий? –

+0

Это может показаться случайным downvoter. Я только что задал два вопроса, которые я задал здесь, без каких-либо особых причин ..:/ –

0

Да, может, так как он не выполняет никакой проверки типов, он может иногда быть быстрее, чем List<T> при работе с ссылочными типами, хотя, как правило, не рекомендуется использовать его, когда у вас есть безопасные альтернативы прекрасно типа ,

Любой тип, который наследуется от object, может быть сохранен в ArrayList. Всякий раз, когда вы получаете доступ к элементу в ArrayList, вы должны быть осторожны, чтобы применить его к правильному типу, иначе вы получите ошибку компилятора.

Я считаю, ArrayList старая реликвия от дней до родовых типов в .NET

+0

Что? ... вы ошибаетесь. Фактически, при отбрасывании объектов обратно он будет медленнее из-за проверки типа времени выполнения. –

+1

Зависит от того, что вы храните в arraylist, для ссылочных типов ArrayList на самом деле немного быстрее (по незначительной сумме, чтобы быть справедливым), проверяется путем добавления ссылочного типа к arraylist более 1000000 итераций и подтверждено. С другой стороны, добавление в «Список » значительно быстрее, чем добавление в «ArrayList». – DGibbs

+0

Я думаю, что я неправильно прочитал ваш ответ. Как я это интерпретировал, вы говорили, что 'ArrayList' всегда работает быстрее, чем' List '.. это не то, что вы имели в виду? –

0

Что касается вашего вопроса, то ArrayList может содержать различные типы объектов.
Вместо этого рекомендуется использовать вместо этого List<T>, чтобы предотвратить необходимость бокса и распаковки для типа object при использовании тех же типов.

Если у вас есть повторяющаяся схема типов могут быть более полезными (и быстрее), чтобы определить пользовательский класс:

protected class arl_items 
{ 
    public string item1 {get; set;}; 
    public int item2 {get; set;}; 
    public int[4,4] item3 {get; set;}; 
} 

и затем:

List<arl_items> arl = new List<arl_items>(); 

Но если есть нет шаблона для ваших значений типов, вы можете также использовать ArrayList, потому что создание List<object> было бы бессмысленным, так как они одинаковы.

Just btw. я предпочитаю использовать List<object> над ArrayList, но это только мое личное предпочтение

+0

. Возможно, уточните использование общего «списка » здесь. Я бы отказался от вашего ответа, но я не уверен, что вы говорите, что «ArrayList» и «List » по сути идентичны (что они есть), или вы говорите, что используете «List » вместо 'ArrayList '(что бессмысленно). –

+0

@SimonWhitehead спасибо, я не знал, что я смешал свои личные предпочтения в ответ слишком много – Vogel612

0

Вы можете иметь diffent типы в ArrayList попробовать это:

var ary = new ArrayList(); 

ary.Add("some string"); 
ary.Add(23.4); 
ary.Add(new StringBuilder()); 
ary.Add("some other string"); 

Вы можете запросить его так:

string[] strings = ary.OfType<string>(); 
StringBuilder[] stringBuilders = ary.OfType<StringBuilder>(); 
Смежные вопросы