Wie lege ich ein readonly-Feld in einer Initialisierungsmethode fest, die vom Konstruktor aufgerufen wird?
Ich bin sicher, ich habe irgendwo gesehen, dass ich Folgendes tun können über ein Attribut über meine Init () - Methode, das sagt dem compiler, dass die Methode Init() muss nur aufgerufen werden, aus dem Konstruktor, so dass die readonly-Feld gesetzt werden. Ich habe vergessen, was das Attribut heißt aber, und ich kann nicht scheinen, um es zu finden über 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;
}
}
InformationsquelleAutor der Frage Ben Anderson | 2010-09-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Rob ' s Antwort ist der Weg, es zu tun, in meinem Buch. Wenn Sie brauchen, um zu initialisieren mehreren Feldern kann man es mit
out
Parameter:Ich persönlich finde, dass macht Sinn in bestimmten Szenarien, etwa wenn Sie möchten, dass Ihre Felder zu
readonly
aber Sie auch wollen in der Lage sein, um Sie anders in einer abgeleiteten Klasse (ohne Kette eine Tonne von Parametern durch einigeprotected
Konstruktor). Aber vielleicht ist das nur mir.InformationsquelleAutor der Antwort Dan Tao
Statt über eine Initialize-Methode, wie zum Erben ein basic-Konstruktor durch alle anderen Konstruktoren.
also
Dies ist vielleicht ein wenig zu spät zu erreichen, die ursprüngliche person in not, aber wie es scheint, dies wird sauber das problem zu lösen... Ohne die Notwendigkeit der Verwendung von jeder Art von bösen Reflexions-oder out-Parameter.
InformationsquelleAutor der Antwort tvt173
Die einzige Lösung, die ich denken kann, ist, um den Rückgabewert aus der
Init()
Methode, diereadonly
Feld muss zugewiesen werden:InformationsquelleAutor der Antwort Rob
Diese nicht getan werden kann. Felder, die markiert sind mit
readonly
kann nur eingestellt werden, aus dem KonstruktorInformationsquelleAutor der Antwort JaredPar
Jared ist richtig; das ist nicht möglich. Die workarounds, die ich denken kann, sind:
Init
- Methode)._myField = GetInitialMyFieldValue();
Init
Methode, mit derout
modifier. Dies kann nützlich sein, wenn Sie viele Felder zu initialisieren, die abhängig von der Konstruktor-Parameter. E. g.InformationsquelleAutor der Antwort Ani
Was ich am Ende tun, in der aktuellen tech-C# 7.x) ist die Verwendung der Wert-Tupel-system:
Nicht der sauberste, Aber scheint sauberer zu mir.
InformationsquelleAutor der Antwort Ran Sagy
C# - compiler nur können Sie set-readonly-Felder, wenn Sie diese initialisiert werden inline:
oder aus dem Konstruktor:
InformationsquelleAutor der Antwort Steve Michelotti
Ich denke, es funktioniert, wenn die Reflektion verwenden. Tatsächlich, das funktioniert für mich:
und
dies ist SetVariableByName():
die einzige Sache ist, dass readonlyField ist öffentlich, nicht privat. Ich weiß, dass Sie Bearbeiten ein eigenes Feld, aber ich bin mir nicht sicher, warum es funktioniert nicht für mich!
InformationsquelleAutor der Antwort Derar