I can't find "field" listed as a C# keyword anywhere. Does anyone know the background on this?
The C# compiler usually has no trouble figuring out what part of a declaration the attribute applies to. I can think of three cases where you might use it:
- Attributes that apply to the assembly. Very visible in AssemblyInfo.cs
- An attribute applied to the return value of a P/Invoke declaration, [return:MarshalAs]
- Having the attribute apply to the backing variable of a property or event without accessors. Your case.
This is necessary, for example, if you are marking an event as non-serializable. It specifies the target that the attribute applies to.
It is part of the attribute target syntax. From the specification:
attribute-target:
field
event
method
param
property
return
type
See also the documentation for NonSerializedAttribute
:
To apply the
NonSerializedAttribute
class to an event, set the attribute location to field, as shown in the following C# code.
[field:NonSerializedAttribute()]
public event ChangedEventHandler Changed;
NonSerializedAttribute
. But as NonSerializedAttribute
only applies to fields, you have to mark it with the attribute-target field
. –
Livy global-attributes
. Specifically, global-attribute-target: assembly module
. –
Livy The C# compiler usually has no trouble figuring out what part of a declaration the attribute applies to. I can think of three cases where you might use it:
- Attributes that apply to the assembly. Very visible in AssemblyInfo.cs
- An attribute applied to the return value of a P/Invoke declaration, [return:MarshalAs]
- Having the attribute apply to the backing variable of a property or event without accessors. Your case.
This is meant to allow you to set NonSerialized attribute on fields, this is useful in serializing events.
For instance this would give you a compilation error
[NonSerialized]
public event SomeEventHandler SomeEvent;
To fix this you have to use field:
[field:NonSerialized]
public event SomeEventHandler SomeEvent;
More on this here -- Delegates and Serialization
This has already been answered but I demonstrate explicitly the case for auto-implemented properties.
[NonSerialized] applies only to fields, because it relates to the binary formatter which serializes field data as opposed to something like Json.NET which serializes properties.
[NonSerialized]
public int Value;
We cannot use it directly on auto-implemented properties - the following does not compile:
[NonSerialized]
public int Value { get; set; }
We can use the "field:" modifier to apply the attribute to the auto-implemented backing field:
[field: NonSerialized]
public int Value { get; set; }
Which is equivalent to:
public int Value
{
get => backingField;
set => backingField = value;
}
[NonSerialized]
private int backingField;
The NonSerializedAttribute is only applicable to fields, you can use it as follows:
[NonSerialized]
public string myString;
© 2022 - 2024 — McMap. All rights reserved.