: base(...)
Если вы опустите вызов базового конструктора, он автоматически вызовет базовый конструктор по умолчанию.
Обязательно вызывать базовый конструктор явно, если конструктор по умолчанию отсутствует.
Даже если есть конструктор по умолчанию, вы все равно можете вызвать конструктор, отличный от конструктора по умолчанию. В этом случае вы все еще можете использовать base(foo, bar)
для вызова конструктора, отличного от базового конструктора.
Я не считаю плохой практикой опускать base()
, если вы хотите вызвать конструктор по умолчанию базового класса, хотя, если вы хотите быть явным, я не вижу вреда в его включении. Это дело вкуса.
: this(...)
Этот синтаксис позволяет вам вызывать одного конструктора с другой сигнатурой от другого в том же классе. Это никогда не обязательно, но иногда может быть полезно.
Примером, когда это может быть полезно, является повторное использование общего кода в конструкторах. Например, в C # 3.5 или перед тем, как вы захотите смоделировать необязательные параметры в конструкторе:
Foo(int x, int y)
{
this.x = x;
this.y = y;
}
Foo(int x) : this(x, 10) {} // y defaults to 10
В C # 4.0 теперь доступны дополнительные параметры, что снижает необходимость в этом подходе.
Альтернативный способ повторного использования кода в конструкторах - это разложить его в статическую функцию, которая вызывается из каждого конструктора, который желает его использовать.