Перегрузка метода по сравнению с дополнительными параметрами - PullRequest
1 голос
/ 10 мая 2011

Кажется, я вспомнил, что читал, что между перегрузкой метода (и цепочкой конструктора) и необязательными параметрами в C # 4.0 было существенное различие, но я не смог найти ничего, подтверждающего какое-либо различие.

Есть ли какие-либо важные различия между следующими двумя реализациями?

Первый

public void Foo()
{
   Foo(String.Empty);
}

public void Foo(string message)
{
   Console.WriteLine(message);
}

Второй

public void Foo(string message = "")
{
   Console.WriteLine(message);
}

Ответы [ 4 ]

8 голосов
/ 10 мая 2011

Я бы предпочел перегрузку метода.Есть известные версии с дополнительными параметрами.

Очень хорошая статья Джона Скита здесь .

Мотивация для добавления этого была , что облегчало общение с COM , где методы могут иметь много параметров и меньше для новой практики проектирования для классов C #

3 голосов
/ 10 мая 2011

Необязательные параметры действуют как константы и заменяются во время компиляции.

public void Foo(string s = "default")
Foo();

Сгенерирует код для звонящего:

public void Foo(string s)
Foo("default");

Это означает, что все сборки, ссылающиеся на вашу, будут иметь СТАРОЕ значение по умолчанию, если вы решите изменить значение по умолчанию в новой версии!

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

1 голос
/ 10 мая 2011

Я бы пошел со вторым вариантом. Вы можете изменить строку по умолчанию на некоторую константу, а затем позже вы можете изменить значение константы, например:

constant String defaultString = String.Empty; //change this later if the default value needs to be something else, can't remember if the syntax is valid C# ;)
//...
public void Foo(string message = defaultString)
{
   Console.WriteLine(message);
}

Кроме того, у вас есть еще одна (хотя и простая) функция для обслуживания.

0 голосов
/ 10 мая 2011

Необязательные параметры - синтаксический сахар.

Кроме обратной совместимости с предыдущими версиями .NET они одинаковы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...