Comment puis-je définir un champ en lecture seule dans une méthode initialize qui est appelée à partir du constructeur?
Je suis sûr que j'ai vu quelque part que je peux effectuer les opérations suivantes à l'aide d'un attribut au-dessus de ma méthode Init (), qui indique au compilateur que la méthode Init() doit être appelée uniquement à partir du constructeur, permettant ainsi le champ en lecture seule à être ensemble. J'ai oublié ce que l'attribut est appelé bien, et je n'arrive pas à le trouver sur google.
public class Class
{
private readonly int readonlyField;
public Class()
{
Init();
}
//Attribute here that tells the compiler that this method must be called only from a constructor
private void Init()
{
readonlyField = 1;
}
}
Vous devez vous connecter pour publier un commentaire.
Rob répondre est la façon de le faire, dans mon livre. Si vous avez besoin d'initialiser plusieurs champs, vous pouvez le faire en utilisant
out
paramètres:Personnellement, je trouve que ça fait sens dans certains cas, comme lorsque vous voulez que votre champs à
readonly
mais vous aussi voulez être en mesure de définir différemment dans une classe dérivée (sans avoir à la chaîne d'une tonne de paramètres par le biais de certainsprotected
constructeur). Mais peut-être que c'est juste moi.Au lieu d'utiliser une méthode Initialize, et hérite d'un constructeur de base par le biais de tous vos autres constructeurs.
c'est à dire
Cela peut être un peu tard pour atteindre la première personne dans le besoin, mais il semble que ce sera proprement résoudre le problème... Sans avoir besoin d'utiliser toute sorte de méchant réflexion ou des paramètres de sortie.
La seule solution que je vois est de renvoyer la valeur de la
Init()
méthode que lereadonly
champ doit être affecté:Cela ne peut être fait. Les champs qui sont marqués avec le
readonly
ne peut être définie qu'à partir du constructeurJared est droit; ce n'est pas possible. Les solutions de contournement que je peux penser sont:
Init
méthode)._myField = GetInitialMyFieldValue();
Init
méthode, avec laout
modificateur. Cela peut être utile si vous avez de nombreux domaines pour initialiser, qui dépendent des paramètres du constructeur. E. g.Ce que j'ai fait dans la technologie actuelle (C# 7.x) est l'utilisation de la valeur du tuple système:
Pas la plus propre qui soit, Mais semble plus propre à moi.
Compilateur C# permet uniquement de définir des champs en lecture seule si vous êtes à l'initialisation d'entre eux en ligne:
ou à partir du constructeur:
Je pense qu'il fonctionne si l'utilisation de la Réflexion. En fait, ce qui fonctionne pour moi:
et
c'est SetVariableByName():
la seule chose est que readonlyField est public et non privé. Je sais que vous pouvez modifier un champ privé, mais je ne suis pas sûr de savoir pourquoi sa ne fonctionne pas pour moi!