2009-09-02 29 views
23

¿Puede ayudarme a entender el práctico diferencias entre estos dos;IList <int> vs Lista <int>

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

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

Pero en C# hay una diferencia entre 'cadena s = "x"' y 'objeto o = "x "'. Ver todas las respuestas a continuación ... –

+1

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

+3

@Tomas: Mi punto era: esto es solo un caso especial de una diferencia fundamental en un lenguaje orientado a objetos. No deberías verlo como un caso especial. Debe comprender el concepto de interfaces en general para ver por qué. –

Respuesta

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

sólo se expondrá a los métodos expuestos por la interfaz IList

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

expondrá a todos los miembros del objeto List

No voy a enumerar aquí todas las diferencias , pero puede consultar las listas de miembros en MSDN para obtener una lista completa de cada uno:

IList(T) Members
List(T) Members

1

IList no te llevará a todas las funciones que se obtiene con la lista.

IList es una interfaz y está implementada por muchas clases tipo lista, una de esas clases es Lista.

-1

Su primer ejemplo se única ser utilizable como un IList<int> sin "fundición" usando la sintaxis as, mientras que el segundo ejemplo también se podrá utilizar como un IEnumerable<int> y ICollection<int> de inmediato.

+2

Incorrecto. IList <> hereda de ICollection <>, que hereda de IEnumerable <>. Por lo tanto, esos también están "disponibles de inmediato". – Lucero

+2

Casting (sin comillas), no tiene que hacerse con la palabra clave 'as'. De hecho, algo así como '(lista como List ) .Sort()' es particularmente malo, porque está intercambiando una posible InvalidCastException, que indica cuál es el problema, para una NullReferenceException, que es engañosa. –

3

Básicamente, IList<> puede ser implementado por cualquier clase (una de las cuales es List<>). Por lo tanto, el uso de IList<> para parámetros y propiedades hace que el acoplamiento sea más flexible, lo que generalmente es bueno, ya que no está restringido a una implementación específica.

2

Si usa el segundo formulario, podrá llamar a los métodos en myList que forman parte de la clase List, pero que no forman parte de la interfaz IList sin un molde.

Si usa el primer formulario, podría asignar otras instancias de IList a myList en caso de que desee utilizar una implementación de IList diferente más adelante.

Al decidir cuál usar, la mejor práctica es generalmente usar la forma más genérica posible que tenga toda la funcionalidad que necesita. Si IList tiene todos los métodos que necesita, entonces úselo. Si IEnumerable tiene todo lo que necesita, puede ser aún más genérico y usarlo en su lugar.

12

La diferencia real es más fácil de ver cuando se hace algo como esto:

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>(); 
} 

Debido a que tanto la lista y BindingList implementan la interfaz IList, se puede acceder a ellos a través de una variable de tipo IList. Si su variable era una lista, y el método que devolvía los datos que deseaba devolvía una BindingList, tendría que tomar el camino difícil y agregar todos los miembros de BindingList devuelto a una nueva lista o simplemente escribir otro método.

1

Te daré un ejemplo muy sencillo

digamos que tenemos una biblioteca de clases y tenemos class1 como clase

Ha 2 métodos

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; 
} 

Ahora, cuando la biblioteca de clases es siendo utilizado. y ocurre más de lo que necesita para cambiar la Colección de Lista a Matriz o tipo indexado.

Podemos hacer esto como

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

pero no podemos hacer esto

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