Представьте ситуации, когда нам для удобства нужно при вызова метода указывать только определённым параметрам значения, а другие параметры должны принимать значения по умолчанию. При этом мы ещё не изучали именованные и опциональные параметры. В таком случае нам нужно будет создавать различные перегрузки того же метода, который внутри себя будет вызывать оригинальный метод передавая ему полученные значения, а незаполненным устанавливать значения по умолчанию, как это приведено ниже:
static void Operation() // 1-я перегрузка.
{
Operation("val", 10, 12.2);
}
static void Operation(string value1) // 2-я перегрузка.
{
Operation(value1, 10, 12.2);
}
static void Operation(string value1, int value2) // 3-я перегрузка.
{
Operation(value1, value2, 12.2);
}
static void Operation(string value1, int value2, double value3) // 4-я перегрузка.
{
Console.WriteLine("{0},{1},{2}", value1, value2, value3);
}
static void Main()
{
Operation(); // 1-я перегрузка.
Operation("val"); // 2-я перегрузка.
Operation("val", 10); // 3-я перегрузка.
Operation("val", 10, 12.2); // 4-я перегрузка.
// Delay.
Console.ReadKey();
}
В таком случае количество кода увеличивается и количество требуемой памяти для хранения его в ОЗУ также увеличивается, что не есть хорошо, ведь этого можно запросто избе,жать используя опциональные параметры, например:
// Метод вызывается так же, если бы это были перегрузки.
static void Operation(string value1 = "val", int value2 = 10, double value3 = 12.2)
{
Console.WriteLine("{0}, {1}, {2}", value1, value2, value3);
}
Теперь нам ненужно писать дополнительные перегрузки этого метода, а при необходимости передачи определённым параметрам значения мы можем сделать это используя позиционные и именованные параметры, например:
Operation(); // 1-я перегрузка.
Operation("val"); // 2-я перегрузка.
Operation("val", 10); // 3-я перегрузка.
Operation("val", 10, 12.2); // 4-я перегрузка.
// Нельзя поставить третий параметр value3 = 12.2, вместо второго параметра value2 = 10!
// 12.2 не может быть приведено к int — здесь C# пытается оставить по умолчанию третий параметр, а не второй.
//Operation("val", 12.2); // ОШИБКА!
// В данном случае возможно использование именованных параметров.
// Они состоят из указания имени параметра, двоеточия и значения, которое мы передаем.
Operation("val", value3: 12.2);
Operation(value2: 33, value3: 12.2);
Источник: видеоурок Александра Шевчука "МЕТОДЫ. РЕКУРСИЯ"