C#自定义属性命名

11

我有一个自定义的Attribute类,定义如下:

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

来自微软网站:

按照惯例,属性类的名称以单词 Attribute 结尾。虽然不是必需的,但推荐遵循此约定以提高可读性。应用属性时,包含单词 Attribute 是可选的。

因此,可以选择使用带或不带 Attribute 单词的属性。

[MyCustom()]
或者
[MyCustomAttribute()]

我的问题是,如果有人使用缩写的名称而不是全名时是否遇到了任何问题?我正在运行4.0框架。

谢谢!


1
什么样的问题?这个问题有点开放性…… - madd0
你应该可以毫无问题地调用[MyCustom](而且不需要任何括号 :) 如果你遇到了问题呢?有错误信息吗? - Sergi Papaseit
3
不需要!我认为这就像在问“你是否曾经遇到过不以I开头命名接口的问题?”这些年来一直运行正常。 - gideon
是的,没错。我遇到了运行时问题,发现调用属性的方式是唯一的变化(但可能还有其他原因)。我担心的一个原因是使用了GetCustomAttribute Assembly方法。但似乎压倒性的回复是它完美地工作。 - JustBrowsing
4个回答

12

没有问题。

在编译后的 IL 中,名称始终带有Attribute(完整类型名称)。

根据 ECMA-334 (C#规范)24.2,解析首先进行精确匹配,然后将“Attribute”附加到[]中给出的名称。此外,如果存在冲突(例如:MyAttribute和MyAttributeAttribute),则在使用“MyAttribute”时会生成编译时错误。


我认为至少对于sharplab使用的版本,这似乎已经更改了,或者我做错了什么? https://sharplab.io/#v2:C4LglgNgPgAgTARgLACgYGYAE9MGFMDeqmJmxpG2cmA4gE4CmDwYAdgOaYiYCCwwdMACMArsAaEAvuRIzMAbXpMWHALpzKMACyYAKgwDOwXBACGBgwAoAlITnSUkoA== - codewing

9

应该没问题...我只建议您不要引入两个属性,这些属性的名称仅因Attribute后缀的数量而不同:

public class FooAttribute : Attribute { }

public class FooAttributeAttribute : Attribute { }

[FooAttribute] // Could be either!

我认为精确匹配会在这里获胜,但请不要在第一次引入歧义。 (我没有检查规范。)


1

不需要。简单易懂!

而且,你可以在不使用空的()括号的情况下使用它。


0
一般来说,你不应该遇到任何问题。C#编译器足够智能,在任何情况下都能将其解析为正确的类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接