2009-03-28 19 views
7

W Java przykład zmienne mogą być inicjowane przez blok inicjującego, jak pokazano poniżej:C# równoważne Java przykład inicjatora

class Example { 
    private int varOne; 
    private int varTwo; 

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

istnieje odpowiednik konstrukt C#?

[Edytuj] Wiem, że może to być zgodne z deklaracją zmiennej instancji. Jednak szukam czegoś podobnego do konstruktora statycznego w C#, ale na przykład zmiennych.

+0

Punkt pedanterii: bloki inicjalizacyjne instancji i inicjalizacja pola instancji wykonywane są przez konstruktora natychmiast * po * wywołaniu super. –

+0

@Tom - Masz rację co do kolejności wywoływania. Komentarz kodu źródłowego został usunięty. – maxyfc

+0

Dlaczego po prostu nie uczynić z niej metody i nie wywołać jej od konstruktora, jeśli tak się dzieje za kulisami? – toxvaerd

Odpowiedz

5

Naprawdę nie ma odpowiednika w języku C#. C# ma tylko 2 sposoby, aby zainicjować instancję varibles

  1. w konstruktorze
  2. jawnie inicjalizacji zmiennej w jest punktem deklaracji

Nie ma sposobu, aby zrobić inicjalizacji po utworzeniu obiektu, ale przed uruchomieniem konstruktora.

7

Załóż konstruktora instancji, że każdy inny miejscowy konstruktor będzie zadzwonić na liście inicjalizacji:

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

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

Jeżeli konstruktor domyślny jest już wymagana przez logikę aplikacji, a następnie susbstitute

private Example() 

z

private Example (object dummy) 

i, oczywiście, odpowiednio zmodyfikuj wywołanie inicjalizacji.

+0

Niestety, nie pozwala to na posiadanie wielu bloków inicjalizujących instancję ... ale dla zwykłego przypadku byłoby to uzasadnione. – TofuBeer

+0

Ciekawy - czym jest TofuBeer? a także, dlaczego chcesz mieć wiele blokerów inicjalizujących instancję? W przypadku tych ostatnich - wydaje się, że doprowadziłoby to do pomylenia z blokami rozproszonymi w kodzie klas, oddzielnymi od konstruktorów i oddzielonymi od deklinacji członków. – Cheeso

+0

przykład concrerte - istnieje prywatne pole tylko do odczytu, które muszę zainicjować na podstawie niektórych metod klas, które są niedostępne przy inicjalizacji statycznej. –

0

Jeśli to, co chcesz dla konkretnego przypadku następnie stopniu, w jakim jest to możliwe, to jak poniżej:

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(); 
    } 

tutaj, to nie jest ograniczeniem, które wymagają zmiennych instancji być publiczne.