Подтвердить что ты не робот

IList <int> vs List <int>

Можете ли вы помочь мне понять практические различия между этими двумя:

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

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

Ответ 1

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

будет выставлять только методы, открытые интерфейсом IList

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

выведет всех членов объекта List

Я не буду перечислять все различия здесь, но вы можете проверить списки участников в MSDN для полного списка для каждого:

Члены IList (T)
Список (T) участников

Ответ 2

Реальное различие легче увидеть, когда вы делаете что-то вроде этого:

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

Поскольку List и BindingList реализуют интерфейс IList, вы можете получить к ним доступ через переменную, напечатанную как IList. Если ваша переменная была списком, а метод, который возвращал нужные вам данные, возвращал BindingList, вам нужно было бы пройти жесткий путь и добавить всех членов возвращаемого BindingList в новый список или просто написать другой метод.

Ответ 3

В принципе, IList<> может быть реализовано любым классом (одним из которых является List<>). Поэтому использование параметров IList<> для параметров и свойств делает связь более свободной, что обычно хорошо, поскольку вы не ограничены одной конкретной реализацией.

Ответ 4

Если вы используете вторую форму, вы сможете вызывать методы в myList, которые являются частью класса List, но не являются частью интерфейса IList без трансляции.

Если вы используете первую форму, вы можете назначить другие экземпляры IList для myList, если вы захотите использовать другую реализацию IList позже.

При принятии решения о том, какой из них следует использовать, наилучшей практикой является, как правило, использование самой общей формы, которая обладает всеми необходимыми функциональными возможностями. Если у IList есть все необходимые методы, используйте это. Если IEnumerable имеет все, что вам нужно, тогда вы можете быть более универсальным и использовать это вместо этого.

Ответ 5

IList не получит вам всех функций, которые вы получаете со списком.

IList - это интерфейс и реализуется многими списковыми классами - один из этих классов ist List.

Ответ 6

Я приведу вам очень простой пример

Давайте скажем, что у нас есть библиотека классов, и мы имеем class1 как класс

Он имеет 2 метода

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

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

Мы можем сделать это как

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

Но мы не можем этого сделать

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

Ответ 7

Ваш первый пример будет использоваться только как IList<int> без "casting" с использованием синтаксиса as, тогда как ваш второй пример также будет использоваться как IEnumerable<int> и ICollection<int> сразу.