Существует ли имя для круглой скобки после new()?

#c#

#c#

Вопрос:

Я хотел узнать больше о конструкции, которую я иногда вижу в некотором коде C #; однако я не знаю ее названия. Прошу прощения, если это дубликат; однако очень сложно искать вещи, не зная их названия.

Конструкция выглядит следующим образом:

 Person me = new Person(){ Name = "Aelphaeis" } ;
  

Существует ли специальное имя для присвоения полей / свойств, подобных этому?

Комментарии:

1. ДА. Это называется инициализатором объекта.

2. Кстати, вы можете опустить пустую круглую скобку при использовании инициализатора объекта.

Ответ №1:

Это называется инициализатором объекта. Например, пусть у нас есть класс с именем Customer , определение которого является следующим:

 public class Customer
{
    public int ID { get; set; }
    public string FirstName { get; set; }
    public string LastName  { get; set; }
    public int Age { get; set; }
}
  

Затем вы могли бы создать экземпляр объекта типа Customer , как показано ниже:

 Customer customer = new Customer 
{ 
    ID = 0, 
    FirstName="firstName", 
    LastName="lastName", 
    Age = 20 
};
  

В нескольких словах это еще один способ создания экземпляра объекта.

Что происходит за кулисами, когда мы используем инициализатор объекта?

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

 Customer customer = new Customer();
  

и затем вызываются установщики свойств в том порядке, в каком они записаны в инициализаторе объекта:

 customer.ID = 0;
customer.FirstName = "firstName";
customer.LastName = "lastName";
customer.Age = 20;
  

Кроме того, понятие, близкое к инициализатору объекта, — это инициализатор коллекции.

Вместо того, чтобы писать это:

 List<int> numbers = new List<int>();
numbers.Add(1);
numbers.Add(2);
numbers.Add(3);
numbers.Add(4);
  

мы могли бы написать это:

 List<int> numbers = new List<int>() { 1, 2, 3, 4 };
  

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

Что происходит за кулисами, когда мы используем инициализатор коллекции?

Если мы возьмем последний пример, то произойдет именно это:

 // Create the a new list
List<int> numbers = new List<int>();

// Add one element after the other, in the order they appear in the
// collection initializer, using the Add method.
numbers.Add(1);
numbers.Add(2);
numbers.Add(3);
numbers.Add(4);
  

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

И последнее, но не менее важное: я хотел бы отметить, что инициализаторы объектов и коллекций были введены в C # 3.0. К сожалению, если вам приходилось писать приложение во времена C # 2.0, у вас не было этой функции.

Комментарии:

1. Инициализатор коллекции (тот, что в вашем примере) и инициализатор объекта (тот, что в примере OP) — это не одно и то же. Важно подчеркнуть разницу между ними.

2. Да, я сделаю это прямо сейчас. Спасибо, что упомянули об этом

3. Отличный ответ; однако я думаю, что его можно улучшить для будущих запросов, добавив пример комментария Филиппа. (новое имя студента {FirstName=»Craig», LastName=»Playstead», ID=116};)

Ответ №2:

Это называется инициализатором объекта. Более подробную информацию вы можете найти здесь

Вы можете сделать то же самое для коллекций (инициализатор коллекции)

 List<Cat> cats = new List<Cat>
{
    new Cat(){ Name = "Sylvester", Age=8 },
    new Cat(){ Name = "Whiskers", Age=2 },
    new Cat(){ Name = "Sasha", Age=14 }
};
  

Лично мне это не нравится по двум причинам,

  1. если исключение генерируется внутри инициализатора объекта, у вас нет точного номера строки, в которой оно произошло. Я бы использовал его для простых инициализаций, но не для какой-то сложной инициализации.
  2. Мне кажется, это сложнее читать (но это личное предпочтение)

Комментарии:

1. Вы сделали отличное замечание о сложной инициализации. Тем не менее, гораздо более вероятно, что исключение будет (или, по крайней мере, должно) возникать ниже по потоку в конструкторе / вызываемых функциях инициализируемого объекта, если это нечто большее, чем просто «создание нового» объекта. 1 за соответствующее предупреждение.

Ответ №3:

Это называется инициализатором объекта. Существует также аналогичный шаблон для коллекций, называемый инициализатором коллекции.

Вот простой пример:

 var widgetA = new Widget
{
    WidgetId = "1",
    WidgetName = "My Widget"
};
  

Вы также можете вызвать конструктор при использовании инициализации объекта:

 // a constructor that takes an id for a parameter
var widgetB = new Widget("1")
{
    WidgetId = "1",
    WidgetName = "My Widget"
};
  

Существует также инициализатор коллекции (который также может быть объединен с инициализатором объекта):

    var widgetList = new List<Widget>
    {
        new Widget {WidgetId = "1", WidgetName = "A"},
        new Widget {WidgetId = "2", WidgetName = "B"},
        new Widget {WidgetId = "3", WidgetName = "C"},
    };
  

Вы также можете вложить инициализаторы объекта или коллекции

 var widget = new Widget
{
    WidgetId = "1",
    WidgetName = "My Widget",
    ChildWidget = new Widget
    {
        WidgetId = "2",
        WidgetName = "I'm a Child Widget"
    }
};
  

Этот шаблон также можно использовать для анонимных объектов:

 var anonymousObject = new 
{
    Id = "1",
    Name = "My Anonymous Object",
};
  

Вы можете использовать шаблон abuse the многими способами, но в определенный момент его может стать довольно трудно читать.

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

Дальнейшее чтение:

Комментарии:

1. Я думаю, это потому, что установка свойств объекта и добавление элементов в список — это две разные вещи? Пожалуйста, поправьте меня, если я здесь ошибаюсь..

2. Хорошо, технически один называется инициализатором объекта, а другой — инициализатором коллекции, но можно ли указать на это как на редактирование, а не как на понижение?

3. Я не знаю. На самом деле я не отклонил ваш ответ ^^

4. @sekky Вы правы, одно из них — это инициализация объекта, а другое — инициализация коллекции, но само по себе это различие вряд ли заслуживает понижения без объяснения со стороны понизителей.