2012-02-16 38 views
30

使用ReSharper時,它會自動添加@,爲什麼?ReSharper給lambda表達式中的變量名稱加上「@」前綴

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)); 
} 
+0

我想知道爲什麼。我猜測會議有助於可讀性,但我可能是錯的。 – spender 2012-02-16 02:14:01

+0

使用'string.Concat',你可以不用'StringBuilder'和循環。 – spender 2012-02-16 02:20:21

回答

26

@符號允許您爲變量名使用保留關鍵字。如@class。我假設Resharper確實這樣做是安全的。

在這種情況下,它不是必需的,它沒有任何作用。

+0

安全...很可能,但r#hq的懶惰氣味,這不是我通常與r#關聯的東西。 – spender 2012-02-16 02:16:27

+4

我注意到R#有時在'group'之前加上'@',即使在沒有必要的情況下也是如此。 'group'是一個上下文關鍵字,所以'@'有時是必需的,但R#似乎並不認識這些情況,只是把'@'放在那裏。 – svick 2012-02-16 02:27:43

+1

@svick:我不確定它是否應該識別這些情況。使用'@'符號是防止未來維護者將其與(無效)上下文關鍵字混淆的好方法。 – Brian 2012-02-16 16:12:46

2

at-sign(@)是逃避名字的。例如。如果你想使用if變量名,你可以寫

int @if; 

if單單是行不通的,因爲if是一個C#的關鍵字。

t前面的@在這裏沒用。可能寫這個的人使用他的私人命名約定並用它來表示lambda參數。

(好的,我明白了,這是Resharper,不是一個人,但它本來可以)。

2

我只看到@用於這一個重構:將LINQ轉換爲方法鏈。在這種情況下,ReSharper正在創建一些lambda變量(可能是數字,具體取決於要轉換的lambda表達式的複雜性)。

一個猜測,原因是他們可能故意使用了一些醜陋的東西,希望你用有意義的名字替換它們。 ReSharper可以用來猜測一個有意義的名字的提示並不多,所以這取決於你。

0

以@爲前綴生成的事物也是其他生成器中的常見行爲。
我至少在由wsdl.exe生成的Web服務代理中看到了它。 WSDL將屬性保護爲,並且wsdl.exe生成名爲@protected的屬性。所以與C#關鍵字保護沒有衝突。
但我不知道爲什麼t在您的案例前綴。在你班上是否有靜態成員名稱爲t

22

你不得不要求resharper的實施者確定,但我可以做一個有教養的猜測。他們大概是未來打樣

自從C#1.0出貨以來,編譯團隊已經向C#添加了21個新的上下文關鍵字;編譯器會將它們作爲關鍵字出現在特定位置,否則就是普通標識符。例如,yield僅在return之前出現時纔是關鍵字。

當resharper工具爲您生成代碼時,他們不知道該代碼是否將在某些假定的C#6中編譯,該代碼在某些情況下使用t作爲上下文關鍵字。因此,他們通過將@置於前面,先發制人地稱呼「此標識符不是上下文關鍵字」,從而「設計未來」。順便說一句,這就是爲什麼的任何標識符都以@作爲前綴的合法原因。

點擊此處瞭解詳情:

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

4

只是一些方面,在ReSharper的5有地方這樣一個錯誤:

groups.Select(group => ...) 

會變成這個

from group in groups ... 

現在,group是LINQ Query Syntax中的一個關鍵字,所以R#5的重構實體lly打破了代碼。在R#6中,這顯然是使用@來標識的。

+0

謝謝!我一直困惑,爲什麼resharper只在我的Group變量前加@。現在對我來說很有意義! – Frame91 2014-06-27 06:00:19