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

时间:2010-01-07 16:57:49

标签: c# .net serialization nonserializedattribute

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

4 个答案:

答案 0 :(得分:12)

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

它是属性目标语法的一部分。来自specification

attribute-target:
    field
    event
    method
    param
    property
    return
    type

另请参阅NonSerializedAttribute的文档:

  

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

     

[field:NonSerializedAttribute()]

     

public event ChangedEventHandler Changed;

答案 1 :(得分:6)

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

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

答案 2 :(得分:5)

这是为了允许您在字段上设置NonSerialized属性,这在序列化事件时很有用。

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

[NonSerialized]
public event SomeEventHandler SomeEvent;

要解决此问题,您必须使用field:

[field:NonSerialized]
public event SomeEventHandler SomeEvent;

此处有更多相关内容 - Delegates and Serialization

答案 3 :(得分:0)

NonSerializedAttribute仅适用于字段,您可以按如下方式使用它:

[NonSerialized]
public string myString;