Когда использовать IList и когда использовать List
Я знаю, что IList — это интерфейс, а List 9X_visual-c# — конкретный тип, но я до сих пор не знаю, когда 9X_dot-net использовать каждый из них. Что я делаю 9X_dot-net сейчас, так это то, что если мне не нужны 9X_c#.net методы Sort или FindAll, я использую интерфейс. Я 9X_c#-language прав? Есть ли лучший способ решить, когда 9X_c#.net использовать интерфейс или конкретный тип?
- Если кому-то все еще интересно, я нахожу лучшие ответы здесь: https://s ...
Ответ #1
Ответ на вопрос: Когда использовать IList и когда использовать List
Я следую двум правилам:
- Примите самый простой тип, который будет работать
- Верните самый богатый тип, который понадобится вашему пользователю
Поэтому при написании 9X_csharp функции или метода, принимающего коллекцию, пишите, чтобы 9X_csharp она принимала не список, а IList
С 9X_.net-framework другой стороны, возвращая объект из функции, вы 9X_c#.net хотите предоставить пользователю максимально 9X_dotnet возможный набор операций, чтобы ему не приходилось 9X_csharp искать. Так что в этом случае, если это 9X_dot-net List
- Я не согласен с двумя правилами ... Я бы использовал наиболее примитивный тип и специально при возврате в этом случае IList (лучше IEnumarable), и вы должны работать со с ...
Ответ #2
Ответ на вопрос: Когда использовать IList и когда использовать List
Рекомендации Microsoft, проверенные FxCop, не 9X_.net-framework рекомендуют использовать List Между прочим, теперь я почти 9X_visual-c# всегда объявляю одномерные массивы как IListpublic interface IMyApi
{
IList
- Мне больше всего нравится это объяснение / пример!<p><span cla ...
Ответ #3
Ответ на вопрос: Когда использовать IList и когда использовать List
IEnumerable
Вам следует попробовать использовать наименее 9X_c-sharp конкретный тип, который соответствует вашим 9X_c-sharp целям.
IEnumerable
менее конкретен, чем IList
.
Вы используете 9X_c-sharp IEnumerable
, когда хотите перебирать элементы в коллекции.
IList
IList
реализует 9X_.net-framework IEnumerable
.
Вы должны использовать IList
, когда вам нужен 9X_dotnet доступ по индексу к вашей коллекции, добавление 9X_.net-framework и удаление элементов и т. Д.
Список
List
реализует 9X_.cs-file IList
.
- Отличный, четкий ответ, который я пометил как полезный. Однако я бы добавил, что для большинства разработчиков в большинстве случаев небольшая разница в размере программы и производительности не вызывает беспокойст ...
Ответ #4
Ответ на вопрос: Когда использовать IList и когда использовать List
Есть одна важная вещь, которую люди всегда 9X_.net-framework упускают из виду:
Вы можете передать простой 9X_.net-framework массив чему-то, что принимает параметр IList
, а 9X_.net затем вы можете вызвать IList.Add()
и получите исключение 9X_c#-language времени выполнения:
Unhandled Exception: System.NotSupportedException: Collection was of a fixed size.
Например, рассмотрим 9X_csharp следующий код:
private void test(IList list)
{
list.Add(1);
}
Если вы вызовете это следующим 9X_c#.net образом, вы получите исключение времени 9X_.net-framework выполнения:
int[] array = new int[0];
test(array);
Это происходит потому, что использование 9X_csharp простых массивов с IList
нарушает принцип подстановки 9X_visual-c# Лискова.
По этой причине, если вы вызываете 9X_.cs-file IList
, вы можете рассмотреть возможность использования 9X_c# List
вместо IList
.
- @MichaWiedenmann Мой ответ здесь специфичен для случая, когда вы вызываете `IList <t> .Add()`. Я не говорю, что вам * не следует * использовать `IList <t>` - я просто указываю ...
Ответ #5
Ответ на вопрос: Когда использовать IList и когда использовать List
Я согласен с советом Ли принимать параметры, но 9X_visual-c# не возвращать их.
Если вы укажете свои методы 9X_.cs-file для возврата интерфейса, это означает, что 9X_.cs-file вы можете изменить точную реализацию позже, и 9X_dotnet метод-потребитель даже не узнает об этом. Я 9X_c# думал, что мне никогда не придется переходить 9X_c#-language с List
Конечно, это 9X_.cs-file нужно применять только к методам, видимым 9X_c#.net извне (т.е. публичным методам). Я лично 9X_csharp использую интерфейсы даже во внутреннем 9X_.cs-file коде, но, поскольку вы можете изменить весь 9X_visual-c# код самостоятельно, если внесете критические 9X_c#.net изменения, это не является строго необходимым.
Ответ #6
Ответ на вопрос: Когда использовать IList и когда использовать List
Всегда лучше использовать самый низкий базовый 9X_c-sharp тип. Это дает разработчику вашего интерфейса 9X_dotnet или потребителю вашего метода возможность 9X_csharp использовать все, что им нравится, за кулисами.
Для 9X_.net-framework коллекций вы должны стремиться использовать 9X_.cs-file IEnumerable, где это возможно. Это дает 9X_c#-language наибольшую гибкость, но не всегда подходит.
- Всегда лучше ** принять ** самый низкий возможный базовый тип. Другое дело - возвращение. Выберите, какие варианты могут быть вам полезны. Так вы думаете, ...
Ответ #7
Ответ на вопрос: Когда использовать IList и когда использовать List
Если вы работаете с одним методом (или даже 9X_dotnet с одним классом или сборкой в некоторых 9X_c#-language случаях) и никто извне не увидит, что вы 9X_c#.net делаете, используйте полноту списка. Но 9X_dot-net если вы взаимодействуете с внешним кодом, например, когда 9X_visual-c# вы возвращаете список из метода, вам нужно 9X_csharp только объявить интерфейс, не обязательно 9X_.net-framework привязываясь к конкретной реализации, особенно 9X_dot-net если вы не можете контролировать, кто компилирует 9X_dot-net ваш код. код потом. Если вы начали с конкретного 9X_visual-c# типа и решили перейти на другой, даже если 9X_c#.net он использует тот же интерфейс, вы сломаете 9X_visual-c# чужой код, если не начали с интерфейса или 9X_c#-language абстрактного базового типа.
Ответ #8
Ответ на вопрос: Когда использовать IList и когда использовать List
Чаще всего лучше использовать наиболее общий 9X_c#.net пригодный для использования тип, в данном 9X_csharp случае IList или, что еще лучше, интерфейс 9X_dot-net IEnumerable, чтобы впоследствии можно было 9X_c#.net удобно переключать реализацию.
Однако в .NET 9X_c#.net 2.0 есть одна досадная вещь — в IList нет 9X_c#.net метода Sort(). Вместо этого вы можете использовать 9X_.net-framework прилагаемый адаптер:
ArrayList.Adapter(list).Sort()
Ответ #9
Ответ на вопрос: Когда использовать IList и когда использовать List
Я не думаю, что для такого рода вещей существуют 9X_dotnet жесткие и быстрые правила, но я обычно придерживаюсь 9X_visual-c# принципа использования самого легкого из 9X_visual-c# возможных способов до тех пор, пока это 9X_c#-language не станет абсолютно необходимым.
Например, допустим, у 9X_visual-c# вас есть класс Person
и класс Group
. В экземпляре Group
много 9X_.cs-file людей, поэтому список здесь имеет смысл. Когда 9X_.net я объявляю объект списка в Group
, я буду использовать 9X_c#.net IList
и создавать его экземпляр как List
.
public class Group {
private IList people;
public Group() {
this.people = new List();
}
}
И, если 9X_c-sharp вам даже не нужно все в IList
, вы всегда можете 9X_csharp использовать IEnumerable
. С современными компиляторами 9X_visual-c# и процессорами я не думаю, что есть какая-то 9X_.net разница в скорости, так что это скорее вопрос 9X_visual-c# стиля.
- почему бы в первую очередь не сделать его просто списком? Я до сих пор не понимаю, почему вы получаете бонус, дел ...
Ответ #10
Ответ на вопрос: Когда использовать IList и когда использовать List
Вы должны использовать интерфейс, только 9X_dot-net если он вам нужен, например, если ваш список 9X_.net приводится к реализации IList, отличной 9X_csharp от List. Это верно, например, когда вы используете 9X_csharp NHibernate, который преобразует IList в 9X_.net-framework объект-мешок NHibernate при извлечении данных.
Если 9X_.cs-file List — единственная реализация, которую 9X_.cs-file вы когда-либо будете использовать для определенной 9X_.cs-file коллекции, не стесняйтесь объявлять ее как 9X_.cs-file конкретную реализацию List.
Ответ #11
Ответ на вопрос: Когда использовать IList и когда использовать List
В ситуациях, с которыми я обычно сталкиваюсь, я 9X_.cs-file редко использую IList напрямую.
Обычно я 9X_dot-net просто использую его как аргумент метода
void ProcessArrayData(IList almostAnyTypeOfArray)
{
// Do some stuff with the IList array
}
Это 9X_c-sharp позволит мне выполнять общую обработку практически 9X_dotnet любого массива в среде .NET, если только 9X_csharp он не использует IEnumerable, а не IList, что 9X_dot-net иногда случается.
Это действительно сводится 9X_c-sharp к той функциональности, которая вам нужна. Я 9X_dotnet бы предложил использовать класс List в большинстве 9X_.net-framework случаев. IList лучше всего подходит, когда 9X_.net вам нужно создать пользовательский массив, который 9X_c#-language может иметь некоторые очень конкретные правила, которые 9X_csharp вы хотели бы инкапсулировать в коллекцию, чтобы 9X_.net не повторяться, но все же хотите, чтобы 9X_.net .NET распознал его как список.
Ответ #12
Ответ на вопрос: Когда использовать IList и когда использовать List
Объект AList позволяет вам создавать список, добавлять 9X_csharp в него элементы, удалять его, обновлять, индексировать 9X_csharp в нем и т. д. Список используется всякий 9X_dot-net раз, когда вам просто нужен общий список, в 9X_.cs-file котором вы указываете тип объекта в нем 9X_.cs-file и все.
С другой стороны, IList - это интерфейс. По 9X_.cs-file сути, если вы хотите создать свой собственный 9X_csharp тип списка, скажем, класс списка с именем 9X_c#.net BookList, тогда вы можете использовать интерфейс, чтобы 9X_visual-c# предоставить вам базовые методы и структуру 9X_c#-language для вашего нового класса. IList предназначен 9X_csharp для тех случаев, когда вы хотите создать 9X_dotnet свой собственный специальный подкласс, реализующий 9X_visual-c# List.
Еще одно отличие: IList - это интерфейс, и 9X_c#.net его нельзя создать. Список - это класс, и 9X_visual-c# его можно создать. Это означает:
IList MyList = new IList();
List MyList = new List
-
59
-
9
-
17
-
11
-
10
-
12
-
10
-
27
-
15
-
7
-
2
-
4
-
63
-
10
-
9
-
7
-
21
-
5
-
10
-
10
-
7
-
29
-
7
-
30
-
7
-
5
-
16
-
5
-
16
-
12
-
10
-
13
-
8
-
13
-
10
-
5
-
5
-
15
-
3
-
23
-
10
-
12
-
18
-
8
-
18
-
5
-
11
-
10
-
5
-
22