Инициализация списка в классе для доступности из функций

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

public Form1()
{
    InitializeComponent();
}

List<string> list = new List<string>() {"one", "two", "three"}; 

Чем отличается список в скобках и без, какой подходит для этого случая:

List<string> list = new List<string> {"one", "two", "three"}; 

2 ответа

Решение

Призвание

List<string> list = new List<string> {"one", "two", "three"}; 

это просто сокращение и неявно вызывает конструктор по умолчанию:

List<string> list = new List<string>() {"one", "two", "three"}; 

Также смотрите сгенерированный код IL, он такой же:

List<string> list = new List<string>() {"one"}; 
List<string> list2 = new List<string> {"one"}; 

будет выглядеть так:

IL_0001:  newobj     instance void class [mscorlib]System.Collections.Generic.List`1<string>::.ctor()
IL_0006:  stloc.2
IL_0007:  ldloc.2
IL_0008:  ldstr      "one"
IL_000d:  callvirt   instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
IL_0012:  nop
IL_0013:  ldloc.2
IL_0014:  stloc.0

IL_0015:  newobj     instance void class [mscorlib]System.Collections.Generic.List`1<string>::.ctor()
IL_001a:  stloc.3
IL_001b:  ldloc.3
IL_001c:  ldstr      "one"
IL_0021:  callvirt   instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
IL_0026:  nop
IL_0027:  ldloc.3
IL_0028:  stloc.1

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

List<string> list = new List<string>();
list.Add("one");
list.Add("two");
list.Add("three");

В () скобки (конструктор) вы можете передать некоторые конкретные параметры, такие как начальный размер списка и т. д. При использовании { } в скобках вы просто инициализируете список некоторыми начальными значениями.

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

Другие вопросы по тегам