如果我创建了一个属性public class SomeAttribute : Attribute {}
,我会像这样使用它:
[SomeAttribute]
public class ClassA{}
或者这个:
[Some]
public class ClassA{}
有什么区别吗?允许它工作的基本机制是什么?
答案 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 {
}