Подтвердить что ты не робот

ReSharper дает префикс "@" для имени переменной в выражении лямбда

При использовании 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));
}
4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

Дополнительная информация здесь:

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

Ответ 3

Просто какой-то контекст, в ReSharper 5 появилась ошибка, в которой это:

groups.Select(group => ...)

превратится в это

from group in groups ...

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

Ответ 4

При знаке at (@) исчезают имена. Например. если вы хотите использовать if как имя переменной, вы можете написать

int @if;

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

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

(Хорошо, я вижу, это был Resharper, а не человек, как бы это ни было).

Ответ 5

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

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

Ответ 6

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