为什么我的属性声明"[field:NonSerialized]"中需要"field:"?

skb*_*skb 16 .net c# serialization nonserializedattribute

我无法在任何地方找到"字段"列为C#关键字.有谁知道这个背景?

jas*_*son 13

例如,如果要将事件标记为不可序列化,则这是必需的.它指定属性适用的目标.

它是属性目标语法的一部分.从规格:

attribute-target:
    field
    event
    method
    param
    property
    return
    type
Run Code Online (Sandbox Code Playgroud)

另请参阅以下文档NonSerializedAttribute:

要将NonSerializedAttribute类应用于事件,请将属性位置设置为字段,如以下C#代码所示.

[field:NonSerializedAttribute()]

public event ChangedEventHandler Changed;

  • 关键是订阅事件的对象将被视为对象图的一部分,并在序列化包含事件的对象时进行序列化.要防止它们被序列化,您必须使用`NonSerializedAttribute`来定义事件.但由于`NonSerializedAttribute`仅适用于字段,因此必须使用attribute-target`field`标记它. (2认同)

Han*_*ant 6

C#编译器通常可以搞清楚该属性适用于哪个声明部分.我可以想到你可以使用它的三种情况:

  1. 适用于程序集的属性.在AssemblyInfo.cs中非常明显
  2. 应用于P/Invoke声明的返回值的属性,[return:MarshalAs]
  3. 将该属性应用于没有访问器的属性或事件的支持变量.你的情况.


Sta*_* R. 5

这意味着允许您在字段上设置NonSerialized属性,这在序列化事件时很有用.

例如,这会给你一个编译错误

[NonSerialized]
public event SomeEventHandler SomeEvent;
Run Code Online (Sandbox Code Playgroud)

要解决这个问题,你必须使用 field:

[field:NonSerialized]
public event SomeEventHandler SomeEvent;
Run Code Online (Sandbox Code Playgroud)

更多相关信息 - 代表和序列化