在C#中,[field: NonSerialized]和[NonSerialized]有什么区别?

4
什么是两者之间的区别?
[field: NonSerialized]
public event EventHandler<SelectedPageChangeEventArgs> SelectedPageChanged;

并且

[NonSerialized]
public event EventHandler<SelectedPageChangeEventArgs> SelectedPageChanged;
3个回答

1

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

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

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

[来自元数据]

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

1

一个标记事件,另一个使用属性标记备份字段。

属性目标

在省略事件访问器声明的事件声明上指定的属性可以应用于正在声明的事件、关联字段(如果事件不是抽象的)或关联的添加和删除方法。在缺少属性目标说明符的情况下,属性适用于事件声明。属性目标等于事件表示属性适用于事件;属性目标等于字段表示属性适用于字段;属性目标等于方法表示属性适用于方法。

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


1
在您的特定情况下,没有区别。您正在涉及属性目标的主题。在某些存在歧义的情况下,目标会发挥作用。该链接很好地解释了这一点。

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