Это результат (обходной путь) отсутствия поддержки необязательных параметров / параметров по умолчанию. Вы можете оказаться в таких ситуациях, как:
MessageBox.Show(string)
...
MessageBox.Show(Window, string, string)
...
MessageBox.Show(Window, string, string, MessageBoxButton, MessageBoxImage, MessageBoxResult, MessageBoxOptions)
В этих случаях обычно тот, у которого больше всего параметров, содержит реализацию, а другие перегрузки просто вызывают его с параметрами по умолчанию. Стоит отметить, что когда число параметров увеличивается до N, количество перегрузок может возрасти до N!.
Конструкторы специальные функции , поэтому вы должны обращаться с ними так, как они этого заслуживают. Объект может быть построен только один раз. Помните, что в обычных функциях вы можете вызывать функцию реализации столько раз, сколько вам нужно. Здесь вам нужно вызвать конструктор один раз , и это также первое, что нужно сделать . Синтаксис цепочки конструктора указывает на эти требования.
Вернемся к исходной проблеме. Несмотря на то, что эти случаи не очень распространены, вы можете решить эту проблему, определив новый тип (здесь с использованием функций C # 3.0), который будет использоваться в качестве параметра:
public class Parameter
{
public string P1 { get; set; }
public int P2 { get; set; }
public string P3 { get; set; }
public double P4 { get; set; }
...
public Parameter()
{
P1 = "p1";
P2 = 2;
P3 = "p3";
P4 = 4.0;
...
}
}
...
FunctionWithManyParametersCanNowBeCalledLike(new Parameter() { P2 = -2 });
Здесь мы предоставили параметры по умолчанию в конструкторе. Это решение для многих конструкторов? Нет.
C # 4.0 будет включать в себя опцию именованных параметров. Таким образом, нам даже не нужно определять новый тип параметра. Вы можете подумать, что это особенность как синтаксический сахар для этого, однако они отличаются. Нам все еще понадобится этот синтаксис для базового класса параметров конструктора.