Что нужно использовать в качестве paramName при выдаче ArgumentException с идентификатором @Escaped?
При создании исключения ArgumentException с идентификатором @Escaped (например, @this
), что я должен использовать в качестве paramName? Буду ли я использовать this
или же @this
?
В качестве примера, предположим, у меня есть метод расширения для перечисления SomeEnum
, Я хочу бросить InvalidEnumArgumentException
когда недействительное перечисление здесь.
public static string GetCode(this SomeEnum @this) {
switch (@this) {
case SomeEnum.Foo: return "Foo";
case SomeEnum.Bar: return "Bar";
case SomeEnum.Baz: return "Baz";
//This is what I'm not sure of vvvvv
default: throw new InvalidEnumArgumentException("@this", (int)@this, typeof(SomeEnum));
}
}
Вышеуказанный правильный путь? Или я должен сделать это:
default: throw new InvalidEnumArgumentException("this", (int)@this, typeof(SomeEnum));
Учитывая, что разные языки имеют разные синтаксисы для этого (VB использует [this]
Исходя из того, что я знаю), я бы предположил, что второй вариант является правильным, но я хотел бы проверить это.
РЕДАКТИРОВАТЬ: Чтобы уточнить, так как большинство людей, кажется, не знают: когда идентификатор предваряется с @
, он вынужден рассматриваться как идентификатор, а не как ключевое слово, но @something
а также something
все тот же идентификатор. Источник Конечно, это не относится к @this
, как this
недопустимый идентификатор.
3 ответа
Фактическое имя параметра (как это ни ужасно) "this"
, Это то, что вы увидите в метаданных. @
требуется только для того, чтобы компилятор знал, что вы на самом деле использовали зарезервированное слово специально.
Как правило, это гораздо лучшее решение, во-первых, избегать использования ключевого слова:
public static string GetCode(this SomeEnum aSomeEnum)
{
switch (aSomeEnum)
{
case SomeEnum.Foo: return "Foo";
case SomeEnum.Bar: return "Bar";
case SomeEnum.Baz: return "Baz";
default: throw new InvalidEnumArgumentException("aSomeEnum", (int)aSomeEnum, typeof(SomeEnum));
}
}
Как уже отмечали другие, "это" - плохой выбор имени параметра - это вызывает ненужную путаницу. Выберите что-нибудь еще (я бы пошел на someEnum
). Если вы назовете параметр "this", то вы должны использовать его в конструкторе, так как это его имя. То, как вы должны экранировать это имя, чтобы заставить C# принять его, не имеет отношения к его имени во время выполнения, что и должно вызывать исключение, если вы хотите быть хорошим, независимым от языка гражданином.NET. (Тем не менее, это плохой выбор для имени именно потому, что this
настолько знакомы программистам C#.)