Я обнаружил, что в C# можно начинать имя переменной с символа '@'. В моем проекте C# я использовал веб-службу (я добавил веб-ссылку на свой проект), написанную на Java. Один из интерфейсных объектов, определенных в WSDL, имел переменную-член с именем «params». Очевидно, что это зарезервированное слово в C#, поэтому у вас не может быть класса с переменной-членом с именем «params». Созданный прокси-объект содержал свойство, которое выглядело следующим образом:
public ArrayList @params {
get { return this.paramsField; }
set { this.paramsField = value; }
}
Я просмотрел документацию по VS 2008 C#, но ничего не нашел. Также поиск в Google не дал мне никаких полезных ответов. Итак, каково точное значение или использование символа «@» в имени переменной / свойства?





Он просто позволяет вам использовать зарезервированное слово в качестве имени переменной. Не рекомендуется ИМХО (кроме случаев, как у вас).
> никогда +1 Не рекомендуется, но никогда не говори никогда. Например, вам может потребоваться реализовать устаревший интерфейс COM, который использует ключевое слово C# в качестве идентификатора. Или Microsoft может ввести новые ключевые слова в новые версии Framework - например, доходность в приложении для торговли облигациями .NET 1.1 :)
@Joe: новое ключевое слово yield не является зарезервированным словом и может использоваться только в контекстах, где ни один идентификатор не мог появиться на законных основаниях. Одна из целей при разработке новых функций для C# состоит в том, чтобы сконструировать их таким образом, чтобы любая программа, которая была легальной до добавления новой функции, стала законной после и иметь то же значение.
@Html.TextboxFor( , , , new { @class = "my-css-class" } ) - хороший пример, когда вы не можете обойти это без необходимости вручную писать HTML или без того, чтобы javascript изменил атрибуты на более позднем этапе.
В программном обеспечении с открытым исходным кодом наблюдается новая тенденция, когда все переменные имеют префикс «@» в коде C#. Я считаю, что это может быть из-за того, что это требование знакомо с программным обеспечением PHP для переменных. И многие веб-системы с открытым исходным кодом теперь написаны на C# (в прошлом это был PHP).
Или любое ключевое слово, зарезервированное или нет. from, по внешнему виду, является безоговорочным ключевым словом - я только что видел код, в котором параметр метода объявлен как string from, но в теле метода он упоминается как @from, предположительно, чтобы предотвратить его интерпретацию как начало LINQ. выражение.
Он просто позволяет вам использовать зарезервированные слова в качестве имен переменных. На днях я хотел var под названием event. Вместо этого я собирался использовать _event, но мой коллега напомнил мне, что я мог бы просто назвать его @event.
В C# символ at (@) используется для обозначения литералов, которые явно не соответствуют соответствующим правилам спецификации языка.
В частности, его можно использовать для имен переменных, которые конфликтуют с зарезервированными ключевыми словами (например, вы не можете использовать params, но вместо этого можете использовать @params, то же самое с out / ref / любым другим ключевым словом в спецификации языка). Кроме того, его можно использовать для строковых литералов без экранирования; это особенно актуально для констант пути, например вместо path = "c:\temp\somefile.txt" можно написать path = @"c:\temp\somefile.txt". Это также действительно полезно для регулярных выражений.
Интересный момент (и полезная мнемоника) - то же самое соглашение между именами параметров "дословно-" или "здесь струны" и одинаково.
Прямо от Спецификация языка C#, Идентификаторы (C#) :
The prefix "@" enables the use of keywords as identifiers, which is useful when interfacing with other programming languages. The character @ is not actually part of the identifier, so the identifier might be seen in other languages as a normal identifier, without the prefix. An identifier with an @ prefix is called a verbatim identifier.
Какая целевая минимальная версия .NET поддерживает @?
Сама .NET не определяет символ @, как это, в спецификации языка C#. Он поддерживает это с момента выхода своей первой версии C# 1.0 (выпущенной вместе с .NET 1.0). csharpindepth.com/articles/chapter1/Specifications.aspx
И для тех, кому интересно, в VB.NET вы можете использовать [ ] для указания дословного идентификатора, например. Dim [String] As String.
Если мы используем ключевое слово в качестве имени идентификатора, мы получаем ошибку компилятора: «Идентификатор ожидается,« Имя идентификатора »является ключевым словом». Чтобы преодолеть эту ошибку, добавьте к идентификатору префикс «@». Такие идентификаторы являются дословными идентификаторами. Символ @ на самом деле не является частью идентификатора, поэтому идентификатор может отображаться на других языках как обычный идентификатор без префикса.
В отличие от символов Perl, префикс @ перед именем переменной в C# не имеет значения. Если x - это переменная, @x - это другое имя той же переменной.
> string x = "abc";
> Object.ReferenceEquals(x, @x).Dump();
True
Но у префикса @ действительно есть использовать, как вы обнаружили - вы можете использовать его для уточнения имен переменных, которые C# в противном случае отклонил бы как незаконные.
> string string;
Identifier expected; 'string' is a keyword
> string @string;
Другой вариант использования - это методы расширения. Первый, специальный параметр можно выделить для обозначения его реального значения с именем @this. Пример:
public static TValue GetValueOrDefault<TKey, TValue>(
this IDictionary<TKey, TValue> @this,
TKey key,
TValue defaultValue)
{
if ([email protected](key))
{
return defaultValue;
}
return @this[key];
}
Вы можете использовать его для использования зарезервированных ключевых слов в качестве имени переменной, например
int @int = 3;
компилятор проигнорирует @ и скомпилирует переменную как int
мыслить не принято
Символ @ позволяет использовать зарезервированные ключевые слова для имени переменной. как @int, @string, @double и т. д.
Например:
string @public = "Reserved Keyword used for me and its fine";
Приведенный выше код работает нормально, но ниже не работает:
string public = "This will not compile";
@rslite: +1 Не рекомендуется :)