Как упростить несколько конструкторов?
Я хотел бы иметь два конструктора для класса, а именно:
public MyClass()
{
// do stuff here
}
public MyClass(int num)
{
MyClass();
// do other stuff here
}
Вышеуказанный правильный способ достижения моей цели? Есть ли какая-то стенография, которая лучше?
5 ответов
public MyClass()
{
// do stuff
}
public MyClass(int num)
: this ()
{
// do other stuff with num
}
: this()
бит называется инициализатором конструктора. Каждый конструктор в C# имеет инициализатор, который запускается перед телом самого конструктора. По умолчанию инициализатор является конструктором без параметров базового класса (или Object
если класс явно не является производным от другого класса). Это гарантирует, что члены базового класса будут правильно инициализированы перед созданием остальной части производного класса.
Инициализатор конструктора по умолчанию для каждого конструктора может быть переопределен двумя способами.
: this(...)
Конструкция определяет другой конструктор в том же классе, который будет инициализатором для конструктора, к которому он применяется.: base(...)
Конструкция определяет конструктор в базовом классе (обычно не конструктор без параметров, так как в любом случае это значение по умолчанию).
Более подробную информацию, чем вы, вероятно, хотели бы видеть в разделе 10.11 спецификации языка C# 4.0.
Правильный синтаксис выглядит так:
public MyClass()
{
// do stuff here
}
public MyClass(int num) : this()
{
// do other stuff here
}
Обратите внимание this()
на втором конструкторе. Это вызывает конструктор в том же классе без параметров.
Вы могли бы также иметь это наоборот:
public MyClass() : this(someReasonableDefaultValueForNum)
{
}
public MyClass(int num)
{
// do all stuff here
}
Есть только еще одна "функция", которую вы можете использовать вместо this
в этом месте, которое base
:
public MyClass(int num) : base(someParameterOnTheBaseClassConstructor)
{
}
Это полезно, если вы не хотите вызывать конструктор по умолчанию без параметров в базовом классе, а один из конструкторов, который принимает параметры.
Вы можете сделать это так:
public MyClass()
{
// do stuff here
}
public MyClass(int num) : this()
{
// do other stuff here
}
Может быть, использовать один конструктор со значением по умолчанию для параметра:
public MyClass(int num = 0)
{
MyClass();
// do other stuff here
}
Вы можете сделать следующее:
public MyClass()
: this(1) { }
public MyClass(int num)
{
//do stuff here
}