Por que preciso de "Campo:" Na minha declaração de atributo [Campo: não serializado]?
-
19-09-2019 - |
Pergunta
Não consigo encontrar "campo" listado como uma palavra -chave C# em qualquer lugar. Alguém sabe o pano de fundo sobre isso?
Solução
O compilador C# geralmente não tem problemas para descobrir a que parte de uma declaração a qual o atributo se aplica. Eu posso pensar em três casos em que você pode usá -lo:
- Atributos que se aplicam à montagem. Muito visível em AssemblyInfo.cs
- Um atributo aplicado ao valor de retorno de uma declaração P/Invoke, [Return: Marshalas
- Ter o atributo se aplicar à variável de apoio de uma propriedade ou evento sem acessores. Seu caso.
Outras dicas
Isso é necessário, por exemplo, se você estiver marcando um evento como não-serriizável. Ele especifica o alvo ao qual o atributo se aplica.
Faz parte da sintaxe do destino do atributo. De especificação:
attribute-target:
field
event
method
param
property
return
type
Veja também a documentação para NonSerializedAttribute
:
Para aplicar o
NonSerializedAttribute
Classe para um evento, defina o local do atributo como campo, conforme mostrado no código C# a seguir.
[field:NonSerializedAttribute()]
public event ChangedEventHandler Changed;
Isso destina -se a permitir que você defina um atributo não serinciado nos campos, isso é útil na serialização de eventos.
Por exemplo, isso lhe daria um erro de compilação
[NonSerialized]
public event SomeEventHandler SomeEvent;
Para consertar isso, você tem que usar field:
[field:NonSerialized]
public event SomeEventHandler SomeEvent;
Mais sobre isso aqui - Delegados e serialização
O não -rolo não -serriizado é aplicável apenas aos campos, você pode usá -lo da seguinte forma:
[NonSerialized]
public string myString;