Pourquoi ai-je besoin « champ: » dans ma déclaration d'attribut « [field: NonSerialized] »?
-
19-09-2019 - |
Question
Je ne peux pas trouver « champ » répertorié comme un mot-clé C # partout. Est-ce que quelqu'un sait l'arrière-plan sur ce sujet?
La solution
Le compilateur C # a généralement aucune difficulté à déterminer quelle partie d'une déclaration de l'attribut applique. Je peux penser à trois cas où vous pourriez l'utiliser:
- Les attributs applicables à l'ensemble. Très visible dans AssemblyInfo.cs
- Un attribut appliqué à la valeur de retour d'une déclaration de P / Invoke, [rendement: MarshalAs]
- Avoir l'attribut appliquer à la variable de support d'une propriété ou d'un événement sans accesseurs. Votre cas.
Autres conseils
Il est nécessaire, par exemple, si vous marquez un événement comme non sérialisable. Il spécifie la cible que l'attribut applique.
Il fait partie de la syntaxe cible d'attribut. De la :
attribute-target:
field
event
method
param
property
return
type
Voir aussi la documentation NonSerializedAttribute
:
Pour appliquer la classe
NonSerializedAttribute
à un événement, définissez l'emplacement d'attribut au champ, comme indiqué dans le code C # suivant.
[field:NonSerializedAttribute()]
public event ChangedEventHandler Changed;
Ceci est destiné à vous permettre de définir l'attribut NonSerialized sur les champs, ce qui est utile dans les événements sérialisation.
Par exemple cela vous donne une erreur de compilation
[NonSerialized]
public event SomeEventHandler SomeEvent;
Pour corriger cela, vous devez utiliser field:
[field:NonSerialized]
public event SomeEventHandler SomeEvent;
En savoir plus sur ce ici - délégués et de sérialisation
Le NonSerializedAttribute est uniquement applicable aux champs, vous pouvez l'utiliser comme suit:
[NonSerialized]
public string myString;