【问题标题】:What's the difference between [Something] and [SomethingAttribute] [duplicate][Something] 和 [Something Attribute] 有什么区别 [重复]
【发布时间】:2015-04-11 00:25:32
【问题描述】:

这可能已经被问过了,但很难搜索。

[Something][SomethingAttribute] 有什么区别?

以下两个都编译:

[DefaultValue(false)]
public bool Something { get; set; }
[DefaultValueAttribute(false)]
public bool SomethingElse { get; set; }

除了外观之外,它们之间有什么区别吗?使用它们的一般准则是什么?

【问题讨论】:

  • 没有区别;更喜欢[DefaultValue(false)]
  • 更好的问题是为什么“xxxAttribute”存在:-)。
  • 我想这对DefaultValueDefaultValueAttributeAttribute 类型很重要..

标签: c# .net-attributes


【解决方案1】:

大多数情况下,它们是相同的。如前所述,当您同时定义了DefaultValueDefaultValueAttribute 时,通常可以将它们互换使用except。通过使用逐字标识符 (@),您可以同时使用这两种方法而不会出现歧义错误。

C#LS 17.2 节更清楚地说明了这一点:

[AttributeUsage(AttributeTargets.All)]
public class X: Attribute {}

[AttributeUsage(AttributeTargets.All)]
public class XAttribute: Attribute {}

[X] // Error: ambiguity
class Class1 {}

[XAttribute] // Refers to XAttribute
class Class2 {}

[@X] // Refers to X
class Class3 {}

[@XAttribute] // Refers to XAttribute
class Class4 {}

这是指属性的实际使用情况。当然,如果您需要使用类型名称,例如使用 typeof 或反射时,则需要使用您为类型提供的实际名称。

【讨论】:

    【解决方案2】:

    两者在属性声明的上下文中是相同的。前者是后者的较短形式。但它确实在方法内部产生了影响。

    例如,如果您在某些方法中说typeof(DefaultValue),则不会编译。你必须改用typeof(DefaultValueAttribute)

    private void DoSomething()
    {
        var type = typeof(DefaultValue);//Won't compile
        var type2 = typeof(DefaultValueAttribute);//Does compile
    }
    

    【讨论】:

    • 如果反对者能指出答案有什么问题,那就更好了。
    • 没有任何问题。我认为反对者不知道你在说什么,因为它显然是一个很好的答案
    • +1 你说得很好。在声明性属性上下文之外,您不能只从末尾删除“属性”。
    【解决方案3】:

    没有功能上的区别。 [Something] 只是 [SomethingAttribute] 的简写语法。

    来自MSDN

    按照惯例,所有属性名称都以 Attribute 结尾。然而, 几种针对运行时的语言,例如 Visual Basic 和 C#,不要求您指定属性的全名。为了 例如,如果要初始化 System.ObsoleteAttribute,则只需 需要将其引用为已过时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      • 2012-05-12
      相关资源
      最近更新 更多