При инициализации в конструкторах C# что лучше: списки инициализаторов или назначение?
класс A использует список инициализаторов, чтобы задать члену значение параметра, в то время как класс B использует назначение в теле конструктора.
может ли кто - нибудь дать какую-либо причину предпочесть один над другим, пока я последователен?
class A
{
String _filename;
A(String filename) : _filename(filename)
{
}
}
class B
{
String _filename;
B(String filename)
{
_filename = filename;
}
}
3 ответов
первый не является законным в C#. Только два элемента, которые могут появиться после двоеточия в конструкторе, являются base
и this
.
поэтому я бы пошел со вторым.
вы имели в виду C++ вместо c#?
для C++ списки инициализаторов лучше, чем назначение по нескольким причинам:
- для типов стручка (int, поплавок, etc..) оптимизатор часто может сделать более эффективный memcpy за кулисами, когда вы предоставляете инициализаторы для данных.
- для типов non-POD (объектов), вы получаете эффективность только путем делать одну конструкцию. С присваивания в конструкторе, компилятор должен сначала построить объект, а затем назначьте его на отдельном шаге (это относится и к типам POD).
C# имеет функцию под названием Объект Инициализатор. Можно указать значения, которые компилятор будет использовать для инициализации указанных членов, и вызвать конструктор по умолчанию. Для этого вам нужно иметь открытый конструктор по умолчанию.