2009-03-28 8 views
7

In Java Instanzvariablen kann durch einen Initialisierungsblock initialisiert werden, wie unten dargestellt:C# Äquivalent von Java-Instanz Initialisierer

class Example { 
    private int varOne; 
    private int varTwo; 

    { 
     // Instance Initializer 
     varOne = 42; 
     varTwo = 256; 
    } 
} 

Gibt es ein Äquivalent Konstrukt in C#?

[Bearbeiten] Ich weiß, dass dies inline mit der Instanzvariablendeklaration sein kann. Ich suche jedoch nach etwas ähnlich dem statischen Konstruktor in C#, aber zum Beispiel Variablen.

+0

Punkt der Pedanterie: Instanzinitialisierungsblöcke und Instanzfeldinitialisierung werden vom Konstruktor sofort * nach * Aufruf von Super ausgeführt. –

+0

@Tom - Sie haben Recht mit der Reihenfolge der Anrufe. Der Quellcode-Kommentar wurde entfernt. – maxyfc

+0

Warum nicht einfach eine Methode machen und sie vom Konstruktor aufrufen, wenn das ohnehin hinter der Szene passiert? – toxvaerd

Antwort

5

Es gibt wirklich keine Entsprechung in C#. C# hat nur 2 Möglichkeiten Instanz zu initialisieren Zugriffe auf Variablen

  1. Im Konstruktor
  2. Durch explizit die Variable es Erklärung Punkt Initialisierung

Es gibt keinen Weg, um eine Initialisierung zu tun, nachdem das Objekt erstellt wird, aber bevor der Konstruktor ausgeführt wird.

7

einen Instanzkonstruktors erstellen, die andere lokale Konstruktor in der Initialisierungsliste nennen:

private Example() 
{ 
    //initialize all fields here 
} 

public Example (/*list of parameters*/) : this() 
{ 
    //do specific work here 
} 

Wenn der Standard-Konstruktor bereits durch die Logik der Anwendung erforderlich ist, dann

susbstitute
private Example() 

mit

private Example (object dummy) 

und natürlich entsprechend Ändern Sie den Initialisierungsaufruf.

+0

leider, dass Sie nicht mehrere Instanz Initialisierungsblöcke haben ... aber für den allgemeinen Fall wäre vernünftig. – TofuBeer

+0

Neugierig - was ist TofuBeer? Und warum sollten Sie mehrere Instanzen initialisieren? Für letzteres scheint es zu einer Verwechslung mit Blöcken zu kommen, die über den Klassencode verstreut sind, getrennt von Konstruktoren und getrennt von den Mitgliedsdecls. – Cheeso

+0

ein concrerte-Beispiel - Es gibt ein privates readonly-Feld, das ich basierend auf einigen Klassenmethoden initialisieren muss, die bei der statischen Initialisierung nicht verfügbar sind. –

0

Wenn dies ist, was Sie für konkreten Fall wollen, dann, soweit es möglich ist, ist wie folgt:

class Example { 
    public int varOne; 
    public int varTwo; 

    public Example(){ 
     Console.WriteLine("varOne : " + varOne + ", varTwo : " + varTwo); 
    } 

    public void getValues() 
    { 
     Console.WriteLine("varOne : " + varOne + ", varTwo : " + varTwo); 
    } 
} 

static void Main(string[] args) 
    { 
     Example e = new Example{ varOne = 42, varTwo = 256}; 
     e.getValues(); 
    } 

Hier also gibt es eine Einschränkung, die Sie Instanzvariablen erfordern würde öffentlich zu sein.