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

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

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

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

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

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

attribute-target: field event method param property return type 

另请参阅NonSerializedAttribute的文档:

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

[field:NonSerializedAttribute()]

public event ChangedEventHandler Changed;

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

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

 [NonSerialized] public event SomeEventHandler SomeEvent; 

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

 [field:NonSerialized] public event SomeEventHandler SomeEvent; 

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

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

 [NonSerialized] public string myString;