2010-05-12 45 views
8

我瀏覽the source code of StyleCop,我發現了一個奇怪的事情:什麼是C#類中的@namespace字段?

/// <summary> 
/// The namespace that the rule is contained within. 
/// </summary> 
private string @namespace; 

// [...] 

internal Rule(string name, string @namespace, string checkId, string context, bool warning) : this(name, @namespace, checkId, context, warning, string.Empty, null, true, false) 
{ 
    Param.Ignore(name, @namespace, checkId, context, warning); 
} 

這是什麼東西?它只是一個簡單的字段,其中at-sign用於指示它是一個字段,而不是namespace關鍵字?如果是這樣,可以使用任何保留字(例如@dynamic,@using等)?

+0

不僅保留字;您可以使用@開始*任何*標識符。爲什麼?因爲*你不知道將來哪些詞將成爲關鍵詞*。如果你是偏執狂,擔心有一天我們會對某個上下文關鍵詞進行「誹謗」,那麼你可以說「int @blah;」並確保即使添加了blah運算符,您的代碼仍將繼續編譯。 – 2010-05-12 14:17:41

+0

還要注意,該字段的名稱是「名稱空間」,而不是「@namespace」。 @僅僅告訴編譯器「後面的東西是名稱,而不是關鍵字」。否則將被忽略。 – 2010-05-12 14:19:05

回答

4

是@標誌可以放在保留字前面,以允許它們用作變量名稱。

var @dynamic = ... 
var @event = .... 

其實我瞭解到,和其他的東西,從this question

6

Bascially肯定。在變量名稱的前面加上@會阻止由於該變量名稱爲關鍵字而導致的錯誤。

http://msdn.microsoft.com/en-us/library/x53a06bb(VS.71).aspx

+3

與將下劃線(或任何其他字符)放在前面有什麼不同? – adrianm 2010-05-12 11:36:36

+2

@adrianm:我發現的區別在於,當使用反射時,如果'@ namespace'將是'namespace',則'FieldInfo.Name',而'_namespace'的名稱將是'_namespace'。 – 2010-05-12 11:54:27

1

是的,你可以用@作爲變量的first and only first字符。

0

正如其他人回答的一樣,只要您用'@'作爲前綴,就可以使用保留關鍵字,但這不是一個好的開發實踐。我寧願只在機器生成的代碼中使用它(例如,在我工作的公司中,我們有一個將Java代碼轉換爲C#的工具;因爲在Java中「事件」不是保留字,所以我們的Java源代碼可能包含這樣的標識符)

最佳

阿德

1

這種技術通常與自動代碼生成配對,作爲標識符可以被產生的是在目標語言中的關鍵字,例如如果Xml架構的代碼生成運行在其上以生成C#類,那麼該架構可能會有一個名爲「event」的屬性。這是一個C#關鍵字,因此代碼生成器可以改爲使用「@event」。

相關問題