2010-01-27 90 views
18

C#屬性在其名稱中是否有「屬性」(例如DataMemberAttribute),但沒有使用此後綴進行初始化?例如:C#屬性名稱縮寫

[DataMember] 
private int i; 
+0

我要說,問題是**如何**是可能的,還沒有回答。但我相信它使用反射'X OR X +「屬性」'來搜索名稱。 – serhio 2010-01-27 10:22:25

+0

@serhio根據Anton Gogolev的說法,它是編譯器提供的一個快捷方式。這對我來說足以作爲答案(如果它是正確的)。它也適用於自定義屬性。 – Fabiano 2010-01-27 10:30:13

+0

個人對我來說不是很清楚什麼樣的「捷徑」可以提供一個編譯器。 – serhio 2010-01-27 11:13:51

回答

19

按照C# Language Specification

按照約定,屬性類的名稱與Attribute後綴。 屬性名稱的形式類型名稱可以包含或省略此後綴。

這是由C#編譯器和決不是一個CLR特徵提供的快捷方式。編譯器對屬性進行特殊處理的另一個示例是ObsoleteAttribute屬性:這個屬性強制編譯器發出警告/錯誤,但它對CLR沒有特殊含義。

至於如何解決屬性,請參閱上面的鏈接。總結它:

如果一個屬性類被發現有和沒有這個後綴,存在歧義,並且編譯時錯誤結果。如果attribute-name拼寫爲使其最右側的標識符爲verbatim identifier,那麼只有沒有後綴的屬性纔會匹配,從而可以解決此類歧義問題。

「逐字標識符」是一個帶有@前綴的標識符。

與MSDN繼續:

using System; 

[AttributeUsage(AttributeTargets.All)] 
public class X: Attribute 
{} 

[AttributeUsage(AttributeTargets.All)] 
public class XAttribute: Attribute 
{} 

[X]     // Error: ambiguity 
class Class1 {} 

[XAttribute]   // Refers to XAttribute 
class Class2 {} 

[@X]     // Refers to X 
class Class3 {} 

[@XAttribute]   // Refers to XAttribute 
class Class4 {} 

屬性[X]是模糊的,因爲它可以指代XXAttribute。使用逐字標識符可以在極少數情況下確定具體的意圖。屬性[XAttribute]不是不明確的(儘管如果有一個名爲XAttributeAttribute的屬性類!)。如果X類的聲明被刪除,那麼這兩個屬性指向名爲XAttribute屬性類,如下所示:

using System; 
[AttributeUsage(AttributeTargets.All)] 
public class XAttribute: Attribute 
{} 

[X]     // Refers to XAttribute 
class Class1 {} 

[XAttribute]   // Refers to XAttribute 
class Class2 {} 

[@X]     // Error: no attribute named "X" 
class Class3 {} 
7

這是同樣的事情。 [XAttribute] == [X]

MSDN

按照慣例,所有的屬性名結束 打出 「屬性」 以 在 .NET Framework中與其他項目區別開來。但是,在使用代碼中的屬性時,您不需要指定 後綴的屬性 。 例如,[DllImport]相當於 到[DllImportAttribute],但DllImportAttribute是屬性的 .NET Framework中的實際名稱。

我們還可以讀到:

如果屬性類的都 有沒有這個後綴發現,一個 不確定性存在,並且 編譯時錯誤的結果。如果 屬性名字的拼寫是使得 其最右邊的標識符是 逐字標識符,則只有未經 後綴的屬性相匹配,從而使這種 歧義有待解決:

using System; 

[AttributeUsage(AttributeTargets.All)] 
public class X: Attribute 
{} 
[AttributeUsage(AttributeTargets.All)] 
public class XAttribute: Attribute 
{} 
[X]     // Error: ambiguity 
class Class1 {} 
[XAttribute]   // Refers to XAttribute 
class Class2 {} 
[@X]     // Refers to X 
class Class3 {} 
[@XAttribute]   // Refers to XAttribute 
class Class4 {} 
3

它在C#-compiler的約定。像它說的MSDN-page on 'Using Attributes'

按照慣例,所有的屬性名結束 的「屬性」字 從 .NET Framework中的其他項目區別開來。但是,在使用代碼中的屬性時,您不需要指定 後綴的屬性 。 例如,[的DllImport]等價 到[DllImportAttribute],但 DllImportAttribute是屬性的 在.NET Framework實際名稱。

它的工作原理the same way in VB.NET

+0

你說這是.NET Framework中的慣例,那麼爲什麼你應該區分C#和VB.NET? – serhio 2010-01-27 11:10:43