Конструкторы могут быть объединены воедино, чтобы избежать дублирования кода, поэтому довольно часто есть частные конструкторы, которые никто не должен вызывать вне класса , но каждый открытый конструктор тогда просто соединяется с .
Пример:
public class Test
{
private Test(int? a,string b) { }
public Test(int a) : this(a, null) { }
public Test(string b) : this(null, b) { }
}
Здесь есть два открытых конструктора, один из которых принимает строку, а другой принимает int, и они оба связаны с общим частным конструктором, который принимает оба аргумента.
Также, конечно, вы можете создавать новые объекты из одного и того же класса, используя закрытый конструктор, например, вы можете захотеть, чтобы специализированные конструкторы были доступны только через статические методы фабрики:
public static Test Create()
{
int? a = ReadConfigurationForA();
string b = ReadConfigurationForB();
return new Test(a, b);
}
Здесь, возможно, было бы неуместно показывать закрытый конструктор внешнему миру, но вместо этого добавьте статический метод фабрики, который выбирает правильные аргументы для передачи конструктору.