【问题标题】:Difference between [field: NonSerialized] and [NonSerialized] in C# [duplicate]C#中[字段:NonSerialized]和[NonSerialized]之间的区别[重复]
【发布时间】:2010-12-15 14:15:54
【问题描述】:

有什么区别

[field: NonSerialized]
public event EventHandler<SelectedPageChangeEventArgs> SelectedPageChanged;

[NonSerialized]
public event EventHandler<SelectedPageChangeEventArgs> SelectedPageChanged;

【问题讨论】:

    标签: c# attributes


    【解决方案1】:

    field: 前缀用于在字段上应用属性,就像method: 用于方法一样。

    在您给定的代码中,只有第一个会编译,而另一个(没有field: 前缀)不会。

    您需要在NonSerialized 属性中添加field: 前缀的原因是它仅限用于字段:

    [来自元数据]

    [AttributeUsage(AttributeTargets.Field, Inherited = false)]
    [ComVisible(true)]
    public sealed class NonSerializedAttribute : Attribute
    {        
        public NonSerializedAttribute();
    }
    

    【讨论】:

      【解决方案2】:

      一个用属性标记事件,另一个标记支持字段。

      Attribute Targets

      在事件声明上指定的省略 event-accessor-declarations 的属性可以应用于正在声明的事件、关联字段(如果事件不是抽象的)或关联的添加和删除方法。在没有属性目标说明符的情况下,该属性适用于事件声明。 attribute-target 等于 event 表示该属性适用于事件;一个属性目标等于字段表示该属性适用于该字段;并且属性目标等于方法表示该属性适用于方法。

      http://en.csharp-online.net/ECMA-334:_24.2_Attribute_specification

      【讨论】:

        【解决方案3】:

        在您的特定情况下,没有区别。您正在进入attribute targets 的主题。在某些模棱两可的情况下,目标会发挥作用。该链接很好地解释了这一点。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-12-03
          • 2018-01-21
          • 1970-01-01
          • 1970-01-01
          • 2015-07-28
          • 2021-02-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多