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

做~自己de王妃 提交于 2019-11-27 01:52:23

问题


I can't find "field" listed as a C# keyword anywhere. Does anyone know the background on this?


回答1:


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.



回答2:


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;




回答3:


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




回答4:


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

[NonSerialized]
public string myString;


来源:https://stackoverflow.com/questions/2022035/why-do-i-need-field-in-my-attribute-declaration-fieldnonserialized

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!