В необязательных параметрах нет ничего нового в C #, и я знал об этом с момента выпуска C # 5.0, но есть кое-что, с чем я только что столкнулся. Когда я использую аннотации к данным для своих моделей MVC, таких как атрибут Required, я вижу следующее:

enter image description here

Итак, я могу:

[Required(ErrorMessage="Something"]

Однако, когда я создаю свои собственные методы с необязательными параметрами, такими как:

void Test(String x = null, String y = null) {}

Я могу передавать аргументы обоими способами:

Test(x = "Test") OR Test(x: "Test")

Это в то время как в атрибуте Required я всегда должен использовать =, и если я использую :, это вызовет ошибку. Например:

 Required(ErrorMessage:"Something") --> Compile time error

Итак, я вижу, что эти именованные параметры созданы не так, как я уже знал. И мой вопрос: как сделать их для метода (как создать такие именованные параметры, как в обязательном атрибуте).

c#
2
James 5 Мар 2015 в 02:18

3 ответа

Лучший ответ

Атрибут имеет собственный синтаксис. Он использует форму name=value для именованных параметров.

Для обычного метода вы не можете использовать эту форму, вы застряли на форме name:value.

Было бы невозможно использовать форму name=value для обычных методов. Компилятор не сможет определить, пытались ли вы использовать именованный параметр или вы пытались присвоить значение переменной и использовать это присвоение в качестве значения параметра.

4
Guffa 4 Мар 2015 в 23:26

Если вы сделаете что-то вроде:

string y; 
Test(y = "Test")

Вы можете вызвать функцию с этим синтаксисом. Но будьте осторожны ... y = "Test" фактически устанавливает переменную y, а затем передает ее функции! Есть побочный эффект, который, вероятно, нежелателен. Также "Test" передается в параметр x функции Test, а не y, потому что он входит в качестве первого параметра.

Короче говоря, вы всегда должны избегать использования этого синтаксиса при вызове функции, потому что он не выполняет то, что вы ожидаете.

0
Erik 4 Мар 2015 в 23:57

Несмотря на то, что этот синтаксис выглядит как вызов метода:

[Required(ErrorMessage="Something")]

Атрибут - это класс , а не метод. Вы не указываете аргумент в строке выше, вы инициализируете свойство. См. Пример в документации базового класса атрибутов, чтобы понять, что я имею в виду.

Таким образом, синтаксис определения атрибута аналогичен синтаксису инициализации класса в C #:

new RequiredAttribute { ErrorMessage = "Something" };

В настоящее время в C # нет эквивалентного синтаксиса для указания именованного аргумента метода.

2
Dan J 4 Мар 2015 в 23:46