开发者

Why do I need "field:" in my attribute declaration "[field:NonSerialized]"?

I can't find "field" listed as a C# keywo开发者_开发知识库rd anywhere. Does anyone know the background on this?


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;


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:

  1. Attributes that apply to the assembly. Very visible in AssemblyInfo.cs
  2. An attribute applied to the return value of a P/Invoke declaration, [return:MarshalAs]
  3. 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


The NonSerializedAttribute is only applicable to fields, you can use it as follows:

[NonSerialized]
public string myString;
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜