#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. Вы сделали отличное замечание о сложной инициализации. Тем не менее, гораздо более вероятно, что исключение будет (или, по крайней мере, должно) возникать ниже по потоку в конструкторе / вызываемых функциях инициализируемого объекта, если это нечто большее, чем просто «создание нового» объекта. 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 Вы правы, одно из них — это инициализация объекта, а другое — инициализация коллекции, но само по себе это различие вряд ли заслуживает понижения без объяснения со стороны понизителей.