ReSharper дает префикс «@» имени переменной в лямбда-выражении - PullRequest
30 голосов
/ 16 февраля 2012

При использовании ReSharper автоматически добавляется @, почему?

public static string RemoveDiacritics(this string input)
{
    if (string.IsNullOrEmpty(input)) return input;
    var normalizedString = input.Normalize(NormalizationForm.FormD);
    var stringBuilder = new StringBuilder();
    foreach (var value in normalizedString.Select(value => 
        new {value, unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(value)})
            .Where(@t => @t.unicodeCategory != UnicodeCategory.NonSpacingMark)
            .Select(@t => @t.value)) stringBuilder.Append(value);
    return (stringBuilder.ToString().Normalize(NormalizationForm.FormC));
}

Ответы [ 6 ]

26 голосов
/ 16 февраля 2012

Символ @ позволяет использовать зарезервированное ключевое слово для имени переменной. Такие как @class. Я бы предположил, что Решарпер делает это, чтобы быть в безопасности.

В этом случае он не нужен и не имеет никакого эффекта.

22 голосов
/ 16 февраля 2012

Вы должны были бы попросить, чтобы разработчики резарпера были уверены, но я могу сделать обоснованное предположение. Они, вероятно, будущее .

За время, прошедшее с момента выпуска C # 1.0, команда компиляторов добавила 21 новое контекстное ключевое слово в C #; компилятор обрабатывает их как ключевые слова, когда они появляются в определенных местах, и как обычные идентификаторы в противном случае. Например, yield - это только ключевое слово, которое появляется до return.

Когда инструмент для повышения резкости генерирует код для вас, они не знают, будет ли этот код скомпилирован в некотором гипотетическом C # 6, который использует t в качестве контекстного ключевого слова в некотором контексте. Таким образом, они «подтверждают будущее» проекта, опережая «этот идентификатор не является контекстным ключевым словом», помещая перед ним @.

Кстати, именно поэтому для любого идентификатора допустимо ставить префикс @.

Больше информации здесь:

http://ericlippert.com/2009/05/11/reserved-and-contextual-keywords/

4 голосов
/ 16 февраля 2012

Просто некоторый контекст, в ReSharper 5 была ошибка, где это:

groups.Select(group => ...)

будет превращено в это

from group in groups ...

Теперь group - это ключевое слово в синтаксисе запросов LINQ, поэтому рефакторинг R # 5 фактически нарушил код. В R # 6 это было исправлено с помощью @ для идентификаторов.

2 голосов
/ 16 февраля 2012

Я видел только @, использованный в этом одном рефакторинге: конвертировать LINQ в цепочку методов. В этом случае ReSharper создает несколько лямбда-переменных (возможно, большое число, в зависимости от сложности преобразуемого лямбда-выражения).

Можно предположить, что причина в том, что они сознательно использовали что-то уродливое в надежде, что вы замените их значимыми именами. На самом деле ReSharper не так много подсказок, чтобы угадать значимое имя, так что решать вам.

2 голосов
/ 16 февраля 2012

Знак (@) экранирует имена.Например, если вы хотите использовать if в качестве имени переменной, вы можете написать

int @if;

if не будет работать, так как if является ключевым словом ac #.

* перед t здесь бесполезно.Вероятно, человек, который написал это, использует свои частные соглашения об именах и использует их для обозначения лямбда-параметров.

(ОК, я вижу, это был Решарпер, а не человек, как бы это ни было).

0 голосов
/ 16 февраля 2012

Приставка сгенерированных элементов к @ - это обычное поведение и в других генераторах.
Я видел это по крайней мере в прокси веб-службы, сгенерированном wsdl.exe. WSDL назвал свойство protected , а wsdl.exe сгенерировал свойство с именем @ protected . Таким образом, нет конфликта с ключевым словом C # protected .
Но я не знаю, почему в вашем случае стоит префикс t . Есть ли в вашем классе статический член с именем t ?

...