我在 C# 关键字列表中找不到 "field"。 有人知道这方面的背景吗?
我在 C# 关键字列表中找不到 "field"。 有人知道这方面的背景吗?
例如,如果您将事件标记为不可序列化,则这是必需的。它指定了属性适用的目标。
它是属性目标语法的一部分。来源于规范:
attribute-target:
field
event
method
param
property
return
type
参见NonSerializedAttribute的文档:
要将
NonSerializedAttribute
类应用于事件,请将属性位置设置为字段,如以下 C# 代码所示。
[field:NonSerializedAttribute()]
public event ChangedEventHandler Changed;
NonSerializedAttribute
属性标记该事件。但是,由于NonSerializedAttribute
仅适用于字段,因此您必须使用属性目标field
标记它。 - jasonC#编译器通常不会有问题来确定属性应用于声明的哪个部分。我能想到三种情况可以使用它:
这是为了让您在字段上设置NonSerialized属性,这在序列化事件时非常有用。
例如,这将导致编译错误。
[NonSerialized]
public event SomeEventHandler SomeEvent;
field:
。[field:NonSerialized]
public event SomeEventHandler SomeEvent;
关于这个问题的更多信息,请参见此处 -- 委托和序列化
NonSerializedAttribute 只适用于字段,您可以按以下方式使用它:
[NonSerialized]
public string myString;
这个问题已经有答案了,但我会明确地演示自动实现属性的情况。
[NonSerialized] 只适用于字段,因为它涉及将字段数据序列化为二进制格式,而不是像 Json.NET 这样将属性序列化。
[NonSerialized]
public int Value;
我们不能直接在自动实现的属性上使用它 - 以下代码无法编译:
[NonSerialized]
public int Value { get; set; }
[field: NonSerialized]
public int Value { get; set; }
等价于:
public int Value
{
get => backingField;
set => backingField = value;
}
[NonSerialized]
private int backingField;