.NET oferuje ogólny kontener listy, którego wydajność jest prawie identyczna (zobacz pytanie Wydajność tablic a listy). Jednak są one zupełnie inne w inicjalizacji.
Tablice są bardzo łatwe do zainicjowania z wartością domyślną iz definicji mają już określony rozmiar:
string[] Ar = new string[10];
Co pozwala na bezpieczne przypisywanie losowych przedmiotów, powiedzmy:
Ar[5]="hello";
z listą rzeczy są trudniejsze. Widzę dwa sposoby wykonania tej samej inicjalizacji, z których żaden nie jest tym, co nazwałbyś eleganckim:
List<string> L = new List<string>(10);
for (int i=0;i<10;i++) L.Add(null);
lub
string[] Ar = new string[10];
List<string> L = new List<string>(Ar);
Jaki byłby czystszy sposób?
EDYCJA: dotychczasowe odpowiedzi odnoszą się do pojemności, co jest czymś innym niż wstępne wypełnienie listy. Na przykład na właśnie utworzonej liście o pojemności 10 nie można tego zrobićL[2]="somevalue"
EDYCJA 2: Ludzie zastanawiają się, dlaczego chcę używać list w ten sposób, skoro nie jest to sposób, w jaki mają być używane. Widzę dwa powody:
Można by całkiem przekonująco argumentować, że listy są tablicami „nowej generacji”, dodającymi elastyczności prawie bez żadnych kar. Dlatego należy ich używać domyślnie. Zwracam uwagę, że mogą nie być tak łatwe do zainicjowania.
To, co obecnie piszę, to klasa bazowa oferująca domyślną funkcjonalność jako część większego frameworka. W domyślnej funkcjonalności, którą oferuję, rozmiar listy jest znany w zaawansowanym i dlatego mogłem użyć tablicy. Chcę jednak zaoferować każdej klasie bazowej możliwość jej dynamicznego rozszerzenia, dlatego wybieram listę.
List
nie zastępuje Array
. Rozwiązują wyraźnie oddzielne problemy. Jeśli chcesz mieć stały rozmiar, potrzebujesz Array
. Jeśli używasz List
, robisz to źle.