2011-11-08 91 views
23

我在VS2010上使用了ReSharper插件,並且我正在生成接口方法。 ReSharper將@放在參數名稱上。那是用來幹什麼的?C#@方法參數修飾符

int Count(Func<ContratoList, bool> @where); 

請告訴我的

int Count(Func<ContratoList, bool> where); 

感謝的區別!

+0

請看這篇關於'@'逐字運算符http://sanity-free.org/112/all_about_the_sign_csharp_verbatim_identifier.html – ja72

回答

41

@符號允許您在變量名中使用reserved words

int @class = 1; 

void MyMethod(int @goto); 

bool @public { get; set; } 

正如馬克正確他的意見,他的回答中指出,實際上ReSharper的是錯誤要做到這一點,因爲whereContextual Keyword的,實際上並不是一個保留字,所以你的方法編譯沒有@

+10

'的文章,其中***明確地不是*** a * reserved *關鍵字;它是一個*上下文*關鍵字。這意味着實際上,問題中的「@ where」達到了:完全沒有。 –

+0

是的,你是對的。它確實表示,我在答案中包含的鏈接中,但是由於問題的原因,我認爲它與'where'是一樣的。我已經提出了你的答案,很好的發現! – Connell

+1

Resharper過分熱衷於將@添加到事物中。 –

1

它允許您使用保留字作爲參數。

4

它允許您使用保留關鍵字作爲變量名稱。

3

這樣做是因爲「這裏」是在C#(LINQ)

4

它將停止此參數像個關鍵字保護的關鍵字(如where是在LINQ關鍵字除其他事項外)。

+2

它不會作爲該位置的關鍵字。 –

+0

@Marc - 這是一個很好的觀點。它必須只是將其作爲一個通用規則來應用 - 試圖通過上下文完美地完成它將是我猜想的更多挑戰。 –

26

在許多方面,resharper是不對的做到這一點。 where上下文關鍵字,意思是:它只在某些特定場景(即LINQ)中充當關鍵字。在所表明的立場中,它實際上什麼都不做。它不會被混淆爲關鍵字,因爲當C#語言設計者向C#添加關鍵字時,他們需要確保預先存在的代碼繼續編譯(儘可能),並且這在早期的C#中是合法的。

@的使用也混淆了一些工具(剃刀,尤其/複雜,因爲剃鬚刀已經使用@指示的代碼的開始 - 這意味着使用@(即@string)有時你需要@,有時你的變量需要@@ - 我知道至少有一個錯誤的IDE警告可能會導致)。

但是!如果參數是ifclass等,則@if/@class允許您將其用作變量名稱,而不是將其作爲C#關鍵字混淆。請注意,也是不是一個好主意。但出於同樣的原因,我們不會開始這樣做全部我們的代碼(string @name = ...等) - 爲什麼在這裏?這是不需要的,並且由這個問題所示,它增加了混淆。

雖然我個人認爲參數名稱不是關鍵字或上下文關鍵字。

+4

值得一提的是,where不僅是一個LINQ關鍵字,而且還用於泛型類型約束 – Connell

+0

是的,設計人員正試圖確保現有代碼儘可能不中斷。然而,當我的一個星期一的早晨,幾個月沒有人碰到的模塊突然拒絕建立時,我感到非常驚訝。原來,它使用'async'作爲方法參數名稱。士氣:在週末之前不要安裝異步CTP – Dyppl