【问题标题】:C# custom attribute namingC# 自定义属性命名
【发布时间】:2011-04-01 13:47:06
【问题描述】:

我有一个自定义属性类,我定义为:

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

来自微软网站:

按照惯例, 属性类以单词结尾 属性。虽然不是必需的,但这 公约被推荐用于 可读性。当属性为 应用,包含这个词 属性是可选的。

所以,属性可以被任何人使用

[MyCustom()]

[MyCustomAttribute()]

我的问题是,是否有人在使用名称的缩写版本与全名时遇到任何问题?我正在运行 4.0 框架。

谢谢!

【问题讨论】:

  • 什么样的问题?这个问题有点开放式……
  • 您应该可以毫无问题地致电[MyCustom](并且没有任何括号:) 那么您有问题吗?有任何错误信息吗?
  • 不!我认为这就像问“你有没有以 I 开头的接口名称的问题?”它多年来一直运行良好......
  • 是的,它是......我遇到了运行时问题,并且该属性的调用方式是我注意到的唯一变化(但可能还有其他变化)。我担心的一个原因是使用 GetCustomAttribute 程序集方法。但似乎压倒性的回答是它工作得很好。

标签: c# .net visual-studio-2010 attributes


【解决方案1】:

没问题。

在编译后的 IL 下,名称总是附加属性(完整的类型名称)。

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

【讨论】:

  • 我认为至少对于sharplab使用的版本这似乎已经改变或者我做错了什么? sharplab.io/…
【解决方案2】:

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

public class FooAttribute : Attribute { }

public class FooAttributeAttribute : Attribute { }

[FooAttribute] // Could be either!

怀疑完全匹配会在这里获胜,但请不要一开始就引入歧义。 (我还没有检查规范。)

【讨论】:

    【解决方案3】:

    不。很简单!

    此外,您可以在没有空的() 括号的情况下使用它

    【讨论】:

      【解决方案4】:

      一般来说,您不应该遇到任何问题。 C# 编译器足够聪明,可以在任何一种情况下将其解析为正确的类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-06
        • 1970-01-01
        • 2015-11-21
        • 1970-01-01
        • 2020-10-30
        • 2012-02-15
        • 1970-01-01
        • 2017-05-31
        相关资源
        最近更新 更多