使用[SomeAttribute]和[Some]装饰类的区别

时间:2012-01-06 05:35:31

标签: c#

如果我创建了一个属性public class SomeAttribute : Attribute {},我会像这样使用它:

[SomeAttribute] 
public class ClassA{}

或者这个:

[Some]
public class ClassA{}

有什么区别吗?允许它工作的基本机制是什么?

4 个答案:

答案 0 :(得分:7)

按照惯例,CLR属性以单词Attribute结尾(它们也来自System.Attribute)。使用属性时,可以安全地包含该单词,或者省略它(只是为了减少视觉混乱)并让编译器为您包含它。

C#规范的第17.1节说:

  

17.1属性类

     

派生自抽象类System.Attribute的类,是否   直接或间接是属性类。宣言   attribute类定义了一种可以放置的新属性   声明。按照惯例,属性类以a命名   属性的后缀。属性的使用可以包括或省略   这个后缀。

在第17.2节的深入中,它解释了如果两个版本都存在,编译器将不会打破平局:

  

17.2属性规范

     

...

     

如果找到带有和不带此后缀的属性类,则为   存在歧义,并产生编译时错误。

在这种情况下,您可以通过指定@Some@SomeAttribute来解决编译错误。 (@代表了一些不常见的“逐字标识符”功能。

答案 1 :(得分:1)

2

之间没有区别

答案 2 :(得分:0)

如果有一个名为Some的类或一个名为SomeAttributeAttribute的类,则只会有所不同。

两种符号都会找到class SomeAttribute。但[Some]也会查找class Some[SomeAttribute]也会找到class SomeAttributeAttribute

答案 3 :(得分:0)

两者之间没有区别。见sblom的回答。

通常,如果您定义自定义属性类,则追加单词Attribute。例如:

public class SomeAttribute : System.Attribute {
}

使用该类时,通常会忽略“属性”一词。例如:

[Some()]  
public class ClassA {
}