Ответ 1
Символ @позволяет использовать зарезервированное ключевое слово для имени переменной. Например, @class
. Я бы предположил, что 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));
}
Символ @позволяет использовать зарезервированное ключевое слово для имени переменной. Например, @class
. Я бы предположил, что Resharper делает это безопасным.
В этом случае он не нужен и не имеет никакого эффекта.
Вам придется попросить реализаторов-нерезидентов быть уверенными, но я могу сделать обоснованное предположение. Вероятно, это будущее.
За время, прошедшее с момента отправки С# 1.0, команда компилятора добавила к С# 21 новое контекстуальное ключевое слово; компилятор рассматривает их как ключевые слова, когда они появляются в определенных местах, и как обычные идентификаторы в противном случае. yield
, например, это только ключевое слово, когда оно появляется перед return
.
Когда инструмент resharper генерирует для вас код, они не знают, будет ли этот код собираться в некотором гипотетическом С# 6, который использует t
как контекстное ключевое слово в некотором контексте. Таким образом, они "будущие доказательства" дизайна путем предварительного вызова "этот идентификатор не является контекстуальным ключевым словом", поставив @
на него.
Кстати, именно поэтому для любого идентификатора допустимо иметь префикс с @
.
Дополнительная информация здесь:
http://ericlippert.com/2009/05/11/reserved-and-contextual-keywords/
Просто какой-то контекст, в ReSharper 5 появилась ошибка, в которой это:
groups.Select(group => ...)
превратится в это
from group in groups ...
Теперь группа является ключевым словом в синтаксисе запросов LINQ Query, поэтому рефакторинг R # 5 фактически нарушил код. В R # 6 это, по-видимому, было зафиксировано с использованием @для идентификаторов.
При знаке at (@) исчезают имена. Например. если вы хотите использовать if
как имя переменной, вы можете написать
int @if;
if
не будет работать, поскольку if
является ключевым словом С#.
@
t
здесь бесполезен. Вероятно, тот, кто написал это, использует свои частные соглашения об именах и использует его для обозначения параметров лямбда.
(Хорошо, я вижу, это был Resharper, а не человек, как бы это ни было).
Я видел только @
, используемый в этом рефакторинге: конвертируйте LINQ в цепочку методов. В этом случае ReSharper создает несколько лямбда-переменных (возможно, большое количество, в зависимости от сложности преобразованного лямбда-выражения).
Можно предположить, что они, возможно, сознательно использовали что-то уродливое в надежде, что вы замените их значимыми именами. На самом деле не так много намеков, которые ReSharper мог использовать, чтобы догадаться о значимом имени, так что это зависит от вас.
Префикс генерируемых вещей by @- обычное поведение в других генераторах тоже.
Я видел это, по крайней мере, в прокси-сервере веб-службы, созданного wsdl.exe. WSDL назвал свойство protected, а wsdl.exe сгенерировал свойство с именем @protected. Таким образом, нет никакого конфликта с ключевым словом С#.
Но я не знаю, почему t префикс в вашем случае. Есть ли статический член в вашем классе, который имеет имя t?