2011-12-01 20 views
7

Klasa ArrayList może zawierać tylko odniesienia do obiektów, ale co się dzieje, gdy zapisujesz typ wartości, taki jak liczby całkowite?"Przechowywanie" typów wartości wewnątrz klasy ArrayList

string str = "Hello"; 
int i = 50; 

ArrayList arraylist = new ArrayList(); 

arraylist.Add(str); // Makes perfectly sense: 
        // Reference to string-object (instance) "Hello" is added to 
        // index number 0 

arraylist.Add(i); // What happens here? How can a reference point to a value 
        // type? Is the value type automatically converted to an 
        // object and thereafter added to the ArrayList? 
+0

możliwe duplikat [W jaki sposób "boks" pracę w .NET? ] (http://stackoverflow.com/questions/5997398/how-does-boxing-work-in-net) –

+5

Niezupełnie - wiedziałbyś tylko, że te dwie są powiązane, jeśli znasz już odpowiedź na to pytanie. – mavnn

+1

@Binary worrier - To ten sam temat, ale musisz wiedzieć, jak to się nazywa. –

Odpowiedz

12

Nazywa się "boxing": automagicznie int jest konwertowane na typ odniesienia. To kosztuje pewną wydajność.

Zobacz także .

0

Dodaje Arraylist.Add(), przyjmuje dowolną wartość i dodaje jako obiekt, więc wartość całkowita zostanie automatycznie przekonwertowana (boxing) i zostanie dodana do listy.

2

Jeśli podciągnąć klasę w ILSpy ArrayList, zobaczysz, że sklep jest podkład:

private object[] _items; 

i że metoda Add akceptuje instancję typu object:

public virtual int Add(object value) { ... } 

Więc kiedy wywołujesz Add z liczbą całkowitą, .NET boxes jest liczbą całkowitą, a następnie zostaje dodana do tablicy _items w ArrayList jako object .

Nawiasem mówiąc, jeśli potrzebujesz ArrayList u tylko liczb całkowitych i używasz programu .NET Framework 2.0 lub nowszej, należy użyć listy (aka ogólne) klasę List<T> zamiast, który będzie działać lepiej, ponieważ unika konieczności box int podczas przechowywania lub pobierania z listy (zobacz sekcję dotyczącą wydajności w tym ostatnim łączu).

Powiązane problemy