Что такое поле @namespace в классе C #?

Я просматриваю исходный код StyleCop и обнаружил любопытный вещь:

/// <summary>
/// The namespace that the rule is contained within.
/// </summary>
private string @namespace;

// [...]

internal Rule(string name, string @namespace, string checkId, string context, bool warning) : this(name, @namespace, checkId, context, warning, string.Empty, null, true, false)
{
    Param.Ignore(name, @namespace, checkId, context, warning);
}

Что это за вещь? Это простое поле, где знак at используется для обозначения того, что это поле, а не ключевое слово namespace? Если да, можно ли использовать знак at для любого зарезервированного слова (например, @dynamic, @using и т. Д.)?


person Arseni Mourzenko    schedule 12.05.2010    source источник
comment
Не только зарезервированные слова; вы можете начинать любой идентификатор с @. Почему? Потому что вы не знаете, какие слова будут ключевыми словами в будущем. Если вы параноик и боитесь, что когда-нибудь мы превратим blah в контекстное ключевое слово, вы можете сказать int @blah; и будьте уверены, что ваш код продолжит компилироваться, даже если мы добавим оператор blah.   -  person Eric Lippert    schedule 12.05.2010
comment
Также обратите внимание, что имя поля - это namespace, а не @namespace. @ Просто сообщает компилятору, что за ним следует имя, а не ключевое слово. В противном случае игнорируется.   -  person Eric Lippert    schedule 12.05.2010


Ответы (5)


Перед зарезервированными словами можно поставить знак @, чтобы их можно было использовать в качестве имен переменных.

var @dynamic = ...
var @event = ....

Я действительно узнал об этом и других вещах из этого вопроса

person Mike Two    schedule 12.05.2010

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

http://msdn.microsoft.com/en-us/library/x53a06bb(VS.71).aspx

person Jason Evans    schedule 12.05.2010
comment
В чем отличие от подчеркивания (или любого другого символа) впереди? - person adrianm; 12.05.2010
comment
@adrianm: разница, которую я обнаружил, заключается в том, что при использовании отражения FieldInfo.Name if @namespace будет 'namespace', тогда как имя _namespace будет '_namespace'. - person Arseni Mourzenko; 12.05.2010

Да, вы можете использовать @ в качестве символа first and only first вашей переменной.

person Mike    schedule 12.05.2010

Этот метод обычно сочетается с автоматической генерацией кода, поскольку могут быть созданы идентификаторы, которые являются ключевыми словами на целевом языке, например если в схеме Xml выполняется генерация кода для создания классов C #, схема может иметь атрибут, называемый «событие». Это ключевое слово C #, поэтому генератор кода может вместо этого использовать «@event».

person Tim Lloyd    schedule 12.05.2010

Как ответили другие люди, вы можете использовать зарезервированные ключевые слова, если вы ставите префикс '@', но IMHO, это не очень хорошая практика разработки. Я бы предпочел использовать его только в машинно-сгенерированном коде (например, в компании, в которой я работаю, у нас есть инструмент, который преобразует код Java в C #; поскольку в Java «событие» не является зарезервированным словом, наш исходный код Java может содержат такие идентификаторы)

Лучший

Адриано

person Vagaus    schedule 12.05.2010