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

前端 未结 4 1319
别那么骄傲
别那么骄傲 2020-12-09 04:21

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

相关标签:
4条回答
  • 2020-12-09 04:45

    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.
    0 讨论(0)
  • 2020-12-09 04:45

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

    [NonSerialized]
    public string myString;
    
    0 讨论(0)
  • 2020-12-09 04:59

    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

    0 讨论(0)
  • 2020-12-09 05:00

    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;

    0 讨论(0)
提交回复
热议问题