Каковы различия между ними и когда вы используете «инициализатор объектов» над «конструктором» и наоборот? Я работаю с C#, если это имеет значение. Кроме того, является ли метод инициализатора объекта конкретным для C# или .NET?В чем разница между инициализатором объекта и конструктором?
ответ
Инициализаторы объектов было что-то добавлено к C# 3, для того, чтобы упростить строительство объектов, когда вы используете объект.
Конструкторы работают с заданными 0 или более параметрами и используются для создания и инициализации объекта до, вызывающий метод получает дескриптор созданного объекта.Например:
MyObject myObjectInstance = new MyObject(param1, param2);
В этом случае конструктор MyObject
будет работать со значениями param1
и param2
. Они оба используются для создания нового MyObject
в памяти. Созданный объект (который настроен с использованием этих параметров) возвращается и устанавливается в myObjectInstance
.
В целом, считается хорошей практикой, когда конструктор требует параметров, необходимых для полной настройки объекта, так что невозможно создать объект в недопустимом состоянии.
Однако часто есть дополнительные свойства, которые могут быть установлены, но не требуются. Это может быть обработано через перегруженные конструкторы, но приводит к наличию множества конструкторов, которые не обязательно полезны в большинстве случаев.
Это приводит к объекту инициализаторами - Объект Initializer позволяет задать свойства или поля на вашем объекте после он был построен, но перед тем вы можете использовать его чем-то другим. Например:
MyObject myObjectInstance = new MyObject(param1, param2)
{
MyProperty = someUsefulValue
};
Это будет вести себя примерно так же, как если бы вы это сделать:
MyObject myObjectInstance = new MyObject(param1, param2);
myObjectInstance.MyProperty = someUsefulValue;
Однако в многопоточный средах неделимость объекта инициализаторе может быть полезным, поскольку оно (см. this answer) - это либо нулевой, либо инициализированный, как и предполагалось.
Кроме того, инициализаторы объектов проще читать (особенно когда вы устанавливаете несколько значений), поэтому они дают вам такую же выгоду, как и многие перегрузки конструктора, без необходимости иметь много перегрузок, усложняющих API для этого класса.
Конструктор - это определенный метод для типа, который принимает заданное количество параметров и используется для создания и инициализации объекта.
Инициализатор объекта - это код, который запускается на объекте после конструктора и может использоваться для кратковременного набора любого количества полей объекта к указанным значениям. Установка этих полей происходит после вызывается конструктор.
Вы бы использовали конструктор без помощи инициализатора объекта, если конструктор достаточно задал начальное состояние объекта. Однако инициализатор объекта должен использоваться вместе с конструктором. Синтаксис требует явного или неявного использования (VB.Net и C#) конструктора для создания исходного объекта. Вы должны использовать инициализатор объекта, когда конструктор не будет достаточно инициализировать объект для вашего использования, и несколько простых полей и/или наборов свойств будут.
Эта заметка «после» важна, спасибо – user8032
Конструктор - это метод (возможно), принимающий параметры и возвращающий новый экземпляр класса. Он может содержать логику инициализации. Ниже вы можете увидеть пример конструктора.
public class Foo
{
private SomeClass s;
public Foo(string s)
{
s = new SomeClass(s);
}
}
Теперь рассмотрим следующий пример:
public class Foo
{
public SomeClass s { get; set; }
public Foo() {}
}
Вы можете достичь того же результата, как и в первом примере с помощью инициализатора объекта, при условии, что вы можете получить доступ к SomeClass, со следующим кодом:
new Foo() { s = new SomeClass(someString) }
Как вы можете видеть, инициализатор объекта позволяет указать значения для общедоступных полей и общедоступных (устанавливаемых) свойств, при этом выполняется конструкция, а t hat особенно полезен, когда конструктор не создает никакой перегрузки, инициализируя определенные поля. Обратите внимание, однако, что инициализаторы объектов являются просто синтаксическим сахаром и что после компиляции не будет отличаться от последовательности назначений.
Если у вас есть свойства, которые ДОЛЖНЫ быть установлены на вашем объекте, чтобы он работал правильно, один способ заключается в том, чтобы выставлять только один конструктор, который требует этих обязательных свойств в качестве параметров.
В этом случае вы не можете создать свой объект без указания этих обязательных свойств. Нечто подобное не может быть реализовано инициализаторами объектов.
Инициализаторы объектов на самом деле просто «удобство синтаксиса» для сокращения первоначальных заданий. Приятно, но не очень функционально.
Марк
Другой способ гарантировать, что существенные свойства заданы для объекта во время построения, - это обеспечить статический («заводский») метод для класса, который возвращает построенный объект. Этот заводский метод создает объект через конструктор * private *. (Может быть полезно определение нескольких частных конструкторов.) – DavidRR
... Кроме того, иногда полезно создать статический заводский * класс *, который несет ответственность за построение экземпляров одного или нескольких других классов. Например, см. [File.Create Method (String)] (https://docs.microsoft.com/en-us/dotnet/api/system.io.file.create?view=netframework-4.7.1#System_IO_File_Create_System_String_) (и его перегрузки), который создает объект FileStream. – DavidRR
Когда вы
Person p = new Person { Name = "a", Age = 23 };
это то, что объект инициализатора по существу делает:
Person tmp = new Person(); //creates temp object calling default constructor
tmp.Name = "a";
tmp.Age = 23;
p = tmp;
Теперь это облегчает поведение как this. Важно знать, как работают инициализаторы объектов.
может это просто человек p = new Person {Name = "a" }? –
@ nick-s да, очень. Для этого предназначен инициализатор объекта. Вы инициализируете членов, которых хотите. – nawfal
Я не знал, что конструкторский парантезис можно пропустить. Благодарю. –
- 1. В чем разница между инициализатором экземпляра и конструктором?
- 2. В чем разница между требуемым инициализатором и назначенным инициализатором?
- 3. В чем разница между пустым инициализатором и инициализатором для структуры?
- 4. Разница между инициализатором или статическим инициализатором?
- 5. В чем разница между простым конструктором и конструктором с базой?
- 6. В чем разница между конструктором функции и конструктором прототипа?
- 7. В чем разница между пустым конструктором и конструктором
- 8. В чем разница между конструктором объектов и глобальным объектом
- 9. В чем разница между конструктором и функцией класса
- 10. В чем разница между спроектированным инициализатором и инициализатором удобства в swift?
- 11. Разница между конструктором и конструктором по умолчанию
- 12. В чем разница между конструктором и процедурой в записях Delphi?
- 13. Разница между конструктором и объектом
- 14. В чем разница между конструктором прокси и Reflect?
- 15. В чем разница между BlobBuilder и новым конструктором Blob?
- 16. В чем разница между конструктором приложений и app.Onstartup?
- 17. В чем разница между инициализацией и конструктором на базовой модели
- 18. Javascript: В чем разница между записью литерала объекта и конструктором объекта?
- 19. Разница между конструктором и инициализацией членов класса?
- 20. Есть ли разница между конструктором и конструктором в javascript?
- 21. Разница между конструктором и свойствами в C#
- 22. Разница между конструктором абстрактных классов и конструктором нормального класса?
- 23. Разница между строковой интерполяцией и инициализатором строки в Swift
- 24. В чем разница между свойством объекта?
- 25. Разница между нормальным конструктором и мутатором? Java
- 26. разница между конструктором копирования Java и C++
- 27. В Objective-C в чем разница между методом Factory и инициализатором удобства?
- 28. В чем разница между «и»?
- 29. В чем разница между `{}` и `[]`?
- 30. В чем разница между == и ===?
Я согласен, но хотел бы добавить, что инициализатор объектов отладки может быть болезненным, особенно если у вас есть вложенная структура, поскольку инициализатор объекта считается одной строкой кода (красиво отформатирован), как и мое предложение. – CrnaStena
@ Reed-Copsey очень хорошее объяснение, будут ли какие-либо улучшения производительности с инициализаторами объектов или это только для удобства чтения? – Mahender
@Mahender На самом деле, при использовании инициализаторов объектов обычно возникают (очень, очень малые) потери. Конструкторы могут быть написаны, чтобы быть более эффективными. –