3

Я хотел бы иметь два конструктора для класса, а именно:Как упростить несколько конструкторов?

public MyClass() 
{ 
    // do stuff here 
} 

public MyClass(int num) 
{ 
    MyClass(); 
    // do other stuff here 
} 

ли выше правильного пути для достижения своей цели? Есть ли какая-то стенография, которая лучше?

ответ

6
public MyClass() 
{ 
    // do stuff 
} 

public MyClass(int num) 
    : this() 
{ 
    // do other stuff with num 
} 

: this() бит называется Constructor Инициализатор. Каждый конструктор в C# имеет инициализатор, который выполняется перед телом самого конструктора. По умолчанию инициализатор является беззаметным конструктором базового класса (или Object, если класс явно не получен из другого класса). Это гарантирует, что члены базового класса будут инициализированы правильно до того, как будет построена остальная часть производного класса.

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

  1. Конструкция : this(...) определяет другой конструктор в том же классе, что и инициализатор для конструктора, к которому он применяется.
  2. Конструкция : base(...) определяет конструктор в базовом классе (обычно это не конструктор без параметров, поскольку он по умолчанию по умолчанию).

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

2

Вы можете сделать это следующим образом:

public MyClass() 
{ 
    // do stuff here 
} 

public MyClass(int num) : this() 
{ 

    // do other stuff here 
} 
+0

Может ли другая функции быть заменена на 'это()' в этом контексте? – CJ7

+0

@ CJ7 Это не функция. Это специальная конструкция синтаксиса. Допустимы только 'this (..)' и 'base (..)'. См. [Использование конструкторов] (http://msdn.microsoft.com/en-us/library/ms173115%28v=vs.110%29.aspx). –

1

Возможно использовать один конструктор со значением по умолчанию для параметра:

public MyClass(int num = 0) 
{ 
    MyClass(); 
    // do other stuff here 
} 
3

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

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) 
{ 
} 

Этих полезно, если вы не хотите вызывать конструктор без параметров по умолчанию в базовом классе, но один из конструкторов, который принимает параметры.

+1

Это называется конструктор-цепочка. –

0

Вы можете сделать следующее:

public MyClass() 
    : this(1) { } 

public MyClass(int num) 
{ 
    //do stuff here 
} 
Смежные вопросы