C#屬性名稱縮寫
回答
按照約定,屬性類的名稱與
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]
是模糊的,因爲它可以指代X
或XAttribute
。使用逐字標識符可以在極少數情況下確定具體的意圖。屬性[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 {}
這是同樣的事情。 [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 {}
它在C#-compiler的約定。像它說的MSDN-page on 'Using Attributes':
按照慣例,所有的屬性名結束 的「屬性」字 從 .NET Framework中的其他項目區別開來。但是,在使用代碼中的屬性時,您不需要指定 後綴的屬性 。 例如,[的DllImport]等價 到[DllImportAttribute],但 DllImportAttribute是屬性的 在.NET Framework實際名稱。
它的工作原理the same way in VB.NET。
你說這是.NET Framework中的慣例,那麼爲什麼你應該區分C#和VB.NET? – serhio 2010-01-27 11:10:43
- 1. dynamodb屬性名稱壓縮
- 2. 名稱縮寫
- 3. 名稱屬性
- 4. 使用JSON.Net編寫屬性名稱
- 5. 對象屬性名稱正在大寫
- 6. 縮寫或完整名稱?
- 7. Concat&縮寫名稱mysql
- 8. JSDoc:屬性名稱
- 9. sql屬性名稱
- 10. 按屬性名稱
- 11. 縮寫屬性訪問器?
- 12. C#函數前綴屬性名稱?
- 13. Objective-C屬性名稱映射
- 14. C#Enum VS Nullable屬性名稱衝突
- 15. 獲取C#中的屬性名稱
- 16. C#MVC屬性名稱爲HTML ID
- 17. C#引用屬性的類的名稱
- 18. 計時器「名稱」屬性? Window Form c#?
- 19. JSON到C#類 - 未知屬性名稱
- 20. 具有相同名稱的c#屬性
- 21. C#XmlIgnoreAttribute類似的屬性名稱
- 22. kivy:「無效的屬性名稱」爲有效的屬性名稱
- 23. Hibernate使用列名稱屬性名稱
- 24. C#通過屬性名稱動態訪問屬性值
- 25. 使用屬性名稱動態訪問Objective-C屬性
- 26. C#按屬性名稱獲取Xelement屬性值
- 27. jquery縮寫一次寫幾個屬性
- 28. .NET:獲取屬性名稱屬性
- 29. 按屬性值獲取屬性名稱
- 30. TextBox - 綁定屬性名稱
我要說,問題是**如何**是可能的,還沒有回答。但我相信它使用反射'X OR X +「屬性」'來搜索名稱。 – serhio 2010-01-27 10:22:25
@serhio根據Anton Gogolev的說法,它是編譯器提供的一個快捷方式。這對我來說足以作爲答案(如果它是正確的)。它也適用於自定義屬性。 – Fabiano 2010-01-27 10:30:13
個人對我來說不是很清楚什麼樣的「捷徑」可以提供一個編譯器。 – serhio 2010-01-27 11:13:51