В необязательных параметрах нет ничего нового в C #, и я знал об этом с момента выпуска C # 5.0, но есть кое-что, с чем я только что столкнулся. Когда я использую аннотации к данным для своих моделей MVC, таких как атрибут Required
, я вижу следующее:
Итак, я могу:
[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
Итак, я вижу, что эти именованные параметры созданы не так, как я уже знал. И мой вопрос: как сделать их для метода (как создать такие именованные параметры, как в обязательном атрибуте).
3 ответа
Атрибут имеет собственный синтаксис. Он использует форму name=value
для именованных параметров.
Для обычного метода вы не можете использовать эту форму, вы застряли на форме name:value
.
Было бы невозможно использовать форму name=value
для обычных методов. Компилятор не сможет определить, пытались ли вы использовать именованный параметр или вы пытались присвоить значение переменной и использовать это присвоение в качестве значения параметра.
Если вы сделаете что-то вроде:
string y;
Test(y = "Test")
Вы можете вызвать функцию с этим синтаксисом. Но будьте осторожны ... y = "Test"
фактически устанавливает переменную y
, а затем передает ее функции! Есть побочный эффект, который, вероятно, нежелателен. Также "Test"
передается в параметр x
функции Test
, а не y
, потому что он входит в качестве первого параметра.
Короче говоря, вы всегда должны избегать использования этого синтаксиса при вызове функции, потому что он не выполняет то, что вы ожидаете.
Несмотря на то, что этот синтаксис выглядит как вызов метода:
[Required(ErrorMessage="Something")]
Атрибут - это класс , а не метод. Вы не указываете аргумент в строке выше, вы инициализируете свойство. См. Пример в документации базового класса атрибутов, чтобы понять, что я имею в виду.
Таким образом, синтаксис определения атрибута аналогичен синтаксису инициализации класса в C #:
new RequiredAttribute { ErrorMessage = "Something" };
В настоящее время в C # нет эквивалентного синтаксиса для указания именованного аргумента метода.
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.