2011-04-01 120 views
9

我有我定义为自定义属性类:C#自定义属性命名

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] 
public sealed class MyCustomAttribute : System.Attribute 
{ 
    ... 
} 

从微软网站:

按照惯例, 属性类的名与字结束 属性。虽然不是必需的,但建议使用 约定 的可读性。当应用属性 时,包含单词 属性是可选的。

因此,该属性可以通过使用两种

[MyCustom()] 

[MyCustomAttribute()] 

我的问题给大家,就是如果有人经历了使用的缩写版本有任何问题名字与全名?我正在运行4.0框架。

谢谢!

+1

什么样的问题?这个问题是一种开放式的...... – madd0 2011-04-01 13:48:53

+0

你应该可以调用'[MyCustom]'没有任何问题(并且没有任何括号)那么你有问题吗?任何错误消息? – 2011-04-01 13:49:21

+3

不!我认为它就像问 - “你有问题没有启动接口名称与我?”_它一直工作很好多年... – gideon 2011-04-01 13:50:36

回答

11

没问题。

在已编译的IL中,名称总是具有附加的属性(完整类型名称)。

基于ECMA-334(C#spec)24.2,解析首先通过完全匹配完成,然后通过将“Attribute”附加到[]中给出的名称。此外,如果存在冲突(例如:MyAttribute和MyAttributeAttribute),则会在使用“MyAttribute”时生成编译时错误。

+2

+1和一个独角兽的吻从规格的细节。 – gideon 2011-04-01 14:10:03

1

没有。易如反掌!

此外,您还可以使用它没有空()括号

0

一般情况下,你不应该打任何问题。无论是哪种情况,C#编译器都足够聪明,可以将其解析为正确的类型。

9

应该没事......我只是劝你还是不要推出带有名称只能由属性后缀的数量不同的两个属性:

public class FooAttribute : Attribute { } 

public class FooAttributeAttribute : Attribute { } 

[FooAttribute] // Could be either! 

嫌疑确切的比赛将在这里夺冠,但请不要在第一时间引入歧义。 (我没有检查规格。)