2010-01-27 10 views
18

Wie ist es möglich, dass C# -Attribute "Attribut" in ihrem Namen haben (z. B. DataMemberAttribute), aber ohne dieses Suffix initialisiert werden? Beispiel:C# Attributname Abkürzung

[DataMember] 
private int i; 
+0

Ich würde bemerken, dass die Frage ist ** WIE ** ist es möglich, wurde noch nicht beantwortet. aber ich glaube, dass es sucht mit Reflection 'X OR X +" Attribut "' für Namen. – serhio

+0

@serhio nach Anton Gogolev ist es eine Abkürzung vom Compiler zur Verfügung gestellt. Dies ist für mich als Antwort ausreichend (wenn es korrekt ist). Und es funktioniert auch mit benutzerdefinierten Attributen. – Fabiano

+0

Persönlich für mich ist nicht sehr klar, welche Art von "Verknüpfung" einen Compiler bereitstellen kann. – serhio

Antwort

19

nach dem C# Language Specification,

Vereinbarungsattributklassen sind mit einem Suffix von Attribute benannt. Ein Attribut-Name der Form Typ-Name kann entweder enthalten oder weglassen dieses Suffix.

Dies ist eine Verknüpfung, die vom C# -Compiler bereitgestellt wird und keinesfalls eine CLR-Funktion. Ein weiteres Beispiel für eine spezielle Behandlung von Attributen durch den Compiler ist ein ObsoleteAttribute Attribut: Dieses erzwingt einen Compiler, um eine Warnung/einen Fehler auszugeben, aber es hat keine besondere Bedeutung für die CLR.

Informationen zur Auflösung von Attributen finden Sie unter dem obigen Link. Um es zusammenzufassen:

Wenn eine Attributklasse mit und ohne dieses Suffix gefunden wird, ist eine Mehrdeutigkeit vorhanden, und ein Fehler bei der Kompilierung resultiert. Wenn der attribute-name so buchstabiert wird, dass sein am weitesten rechts gelegener Bezeichner ein verbatim identifier ist, dann wird nur ein Attribut ohne ein Suffix verglichen, wodurch ermöglicht wird, dass eine solche Zweideutigkeit aufgelöst wird.

Ein "Verbatim Identifier" ist eine Kennung mit einem @ Präfix.

Weiter mit 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 {} 

Das Attribut [X] ist nicht eindeutig, da sie entweder X oder XAttribute beziehen könnte. Durch die Verwendung eines Verbatim-Identifizierers kann in solchen seltenen Fällen die genaue Absicht angegeben werden. Das Attribut [XAttribute] ist nicht mehrdeutig (obwohl es wäre, wenn es eine Attributklasse mit dem Namen XAttributeAttribute gäbe!). Wird die Erklärung für die Klasse X entfernt wird, dann beziehen sich beide Attribute auf das Attribut Klasse XAttribute genannt, wie folgt:

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

Dies ist die gleiche Sache. [XAttribute] == [X]

von MSDN:

Vereinbarungsgemäß werden alle Attributnamen mit dem Wort "Attribut" von Tür zu sie von anderen Elementen in das .NET Framework zu unterscheiden. Sie müssen jedoch nicht das Attribut Suffix angeben, wenn Sie Attribute in Code verwenden. Zum Beispiel ist [DllImport] äquivalent zu [DllImportAttribute], aber DllImportAttribute sind das tatsächlichen Namen im .NET Framework-Attribute.

wir auch lesen können:

Wenn ein Attribut Klasse sowohl mit und ohne dieses Suffix gefunden wird, eine Mehrdeutigkeit vorhanden ist, und ein Kompilierzeitfehler Ergebnisse. Wenn das Attribut-Namen so geschrieben ist, dass seine am weitesten rechts stehenden Kennung ist ein wörtlich Kennung, dann wird nur ein Attribut ohne Suffix abgestimmt ist, so dass eine solche eine Mehrdeutigkeit ermöglicht gelöst werden:

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

Es ist eine Konvention in der C# -compiler. Wie heißt es auf der MSDN-page on 'Using Attributes':

Vereinbarungs Attribut alle Namen mit dem Wort „Attribut“ zu Ende unterscheiden sie von anderen Elementen in das .NET Framework. Sie müssen jedoch nicht das Attribut Suffix angeben, wenn Sie Attribute in Code verwenden. Zum Beispiel [DllImport] äquivalent zu [DllImportAttribute], aber DllImportAttribute das tatsächlichen Namen im .NET Framework-Attribute ist.

Es funktioniert the same way in VB.NET.

+0

Sie haben gesagt, dass dies eine Konvention in .NET Framework ist. Warum sollten Sie zwischen C# und VB.NET unterscheiden? – serhio