2009-09-02 21 views
23

Czy możesz mi pomóc zrozumieć różnice między tymi dwoma;IList <int> vs Lista <int>

IList<int> myList = new List<int>(); 

List<int> myList = new List<int>(); 
+6

Ale w C# istnieje różnica pomiędzy 'łańcucha s = "x"' i 'obiekt O =„x "'. Zobacz wszystkie odpowiedzi poniżej ... –

+1

http://stackoverflow.com/questions/764748/whats-the-difference-between-ienumerable-and-array-ilist-and-list –

+3

@ Tomas: Chodzi mi o to: to jest tylko szczególny przypadek fundamentalnej różnicy w języku obiektowym. Nie powinieneś patrzeć na to jako na specjalny przypadek. Powinieneś zrozumieć koncepcję interfejsów w ogóle, aby zobaczyć, dlaczego. –

Odpowiedz

36
IList<int> myList = new List<int>(); 

narazi jedynie metody narażone przez interfejs IList

List<int> myList = new List<int>(); 

narazi wszystkich członków obiektu List

nie będę notować wszystkie różnice tutaj , ale możesz przejrzeć listy członków w witrynie MSDN, aby uzyskać pełną listę dla każdego:

IList(T) Members
List(T) Members

1

IList nie będzie Ci wszystkie funkcje Ci z listy.

IList jest interfejsem i jest implementowany przez wiele klas listopodobnych - jedna z tych klas ist List.

-1

Pierwszym przykładem będzie tylko być użyteczny jako IList<int> bez „rzucania” używając składni as, natomiast drugim przykładzie będzie również użyteczny jako IEnumerable<int> i ICollection<int> razu.

+2

Niepoprawnie. IList <> dziedziczy po ICollection <>, który dziedziczy po IEnumerable <>. Dlatego są one również "dostępne od zaraz". – Lucero

+2

Przesyłanie (bez potrzeby podawania cudzysłowów) nie musi być wykonywane przy użyciu słowa kluczowego "as". W rzeczywistości coś takiego jak '(lista jako) .Sort()' jest szczególnie złe, ponieważ handlujesz możliwym InvalidCastException, który mówi, jaki jest problem, dla wyjątku NullReferenceException, który jest mylący. –

3

Zasadniczo IList<> może zostać zaimplementowany przez dowolną klasę (jedną z nich jest List<>). Dlatego użycie parametrów IList<> dla parametrów i właściwości powoduje, że sprzężenie jest bardziej luźne, co zwykle jest dobre, ponieważ nie jesteś ograniczony do jednej konkretnej implementacji.

2

Jeśli użyjesz drugiego formularza, będziesz mógł wywoływać metody na myList, które są częścią klasy List, ale nie będą częścią interfejsu IList bez rzutowania.

Jeśli użyjesz pierwszego formularza, będziesz mógł przydzielić inne wystąpienia IList do myList w przypadku, gdybyś chciał później użyć innej implementacji IList.

Przy podejmowaniu decyzji, który z nich należy zastosować, najlepszą praktyką jest zazwyczaj użycie najbardziej ogólnej formy, która ma wszystkie potrzebne funkcje. Jeśli IList ma wszystkie potrzebne metody, użyj tego. Jeśli IEnumerable ma wszystko, czego potrzebujesz, to możesz być jeszcze bardziej ogólny i użyć go zamiast tego.

12

Prawdziwa różnica jest lepiej widoczny, gdy zrobisz coś takiego:

IList<int> myList; 

if (x == true) 
    myList = getBindngList(); 
else 
    myList = getList(); 


public BindingList<int> getBindingList() 
{ 
    // do important things... 
    return new BindingList<int>(); 
} 

public List<int> getList() 
{ 
    // do important things... 
    return new List<int>(); 
} 

Ponieważ zarówno Wykaz i BindingList wdrożyć IList interfejs, można uzyskać do nich dostęp za pośrednictwem zmiennej wpisane jako IList. Jeśli twoją zmienną była Lista, a metoda, która zwróciła poszukiwane dane, zwróciła BindingList, to musisz wziąć twardą drogę i dodać wszystkich członków zwróconej BindingList do nowej Listy lub po prostu napisać inną metodę.

1

dam wam bardzo prosty przykład

Powiedzmy mamy bibliotekę klas i mamy class1 jako klasy

Posiada 2 metody

public IList getList() 
{ 
    IList mylist=new List(); 
    mylist.add("hello"); 
    mylist.add("hi"); 
    return mylist; 
} 

public List getList() 
{ 
List mylist=new List(); 
mylist.add("hello"); 
mylist.add("hi"); 
return mylist; 
} 

Teraz, gdy biblioteka klasa używane. i to się dzieje, niż musisz zmienić Collection from List to Array lub indexed type.

Możemy to zrobić jak

public IList getList() 
{ 
    IList mylist=new int[10]; 
    lst[0] = 10; 
    return mylist; 
} 

ale nie możemy zrobić tego

public List getList() 
{ 
    List mylist=new int[10]; 
    lst[0] = 10; 
    return mylist; 
} 
Powiązane problemy