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

Определение списка С#, круглые скобки и фигурные скобки

Я только что заметил, что, когда вы объявляете List в С#, вы можете поместить круглые скобки или фигурные скобки в конце.

List<string> myList = new List<string>();
List<string> myList2 = new List<string>{};

Оба эти списка имеют одинаковую функциональность. Есть ли какая-либо фактическая разница, вызванная объявлением их скобками или фигурными фигурными скобками?

4b9b3361

Ответ 1

Использование фигурных скобок { } называется инициализатором коллекции. Для типов, реализующих IEnumerable, метод Add будет вызываться нормально, от вашего имени:

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

Разрешены пустые инициализаторы коллекции:

List<string> myList2 = new List<string>() { };

И при реализации инициализатора вы можете опустить скобку () для конструктора по умолчанию:

List<string> myList2 = new List<string> { };

Вы можете сделать что-то подобное для свойств класса, но затем оно называется инициализатором объекта.

var person = new Person
                 {
                     Name = "Alice",
                     Age = 25
                 };

Их можно комбинировать:

var people = new List<Person>
                 {
                     new Person
                         {
                             Name = "Alice",
                             Age = 25
                         },
                     new Person
                         {
                             Name = "Bob"
                         }
                 };

Эта языковая функция, введенная в С# 3.0, также поддерживает инициализацию анонимных типов, что особенно полезно в выражениях запроса LINQ:

var person = new { Name = "Alice" };

Они также работают с массивами, но вы можете дополнительно опустить тип, который выводится из первого элемента:

var myArray = new [] { "one", "two", "three" };

И инициализация многомерных массивов происходит примерно так:

var myArray = new string [,] { { "a1", "b1" }, { "a2", "b2" }, ... };

Ответ 2

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

Итак, вы можете сделать что-то вроде:

List<string> Foo = new List<string>{"foo", "bar"};

или

List<T> Foo = new List<T>{SomeInstancesOfT};

Это полезно во многих местах при инициализации объектов.

См. https://msdn.microsoft.com/en-us/library/bb384062.aspx

Ответ 3

У них разная семантика.

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

Вышеупомянутая строка инициализирует новый список строк, а () является частью синтаксиса построения нового объекта, вызывая его конструктор без параметров.

List<string> myList2 = new List<string>{};

Вышеупомянутая строка инициализирует новый список строк с элементами, представленными внутри {}. Итак, если вы сделали List<string> myList2 = new List<string>{"elem1", "elem2"};, вы определяете новый список с двумя элементами. Поскольку вы не определили элементы внутри {}, он создаст пустой список.

Но почему вторая строка не имеет ()?

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

Ответ 4

Короче - нет никакой разницы в создаваемых объектах.

Но есть еще: То, что вы задаете, не является конкретным вопросом List - это вопрос инициализации object и Collection.

Смотрите здесь.