2010-09-06 13 views
5

Załóżmy zainicjować członków klasy tak:W języku C#, czy domyślny konstruktor generowany jest po zainicjowaniu elementów klasy?

class A 
{ 
    public int i=4; 
    public double j=6.0; 
} 

Czy kompilator wygeneruje domyślnego konstruktora w tej sytuacji?

Ogólnie wiem, że konstruktor może zainicjować wartość zmiennych instancji klasy i może również wykonać inne operacje inicjowania odpowiednie dla tej klasy. Ale w powyższym przykładzie zainicjowałem wartość i i j poza konstruktorem. Czy w tej sytuacji kompilator nadal generuje domyślny konstruktor? Jeśli tak, co robi domyślny konstruktor?

+0

W dużym stopniu zredagowałem Twoje pytanie, aby wyjaśnić, o czym myślę, że próbujesz zadać i potencjalnie poświęcić temu więcej uwagi. Jeśli źle oceniłem Twoje zamiary, cofnij moją edycję lub edytuj dalej. – DavidRR

Odpowiedz

11

Kompilator nadal generuje domyślny konstruktor w tym przypadku. Konstruktor obsługuje inicjalizację i i j. Jeśli spojrzeć na IL, jest to oczywiste.

.class auto ansi nested private beforefieldinit A 
    extends [mscorlib]System.Object 
{ 
    .method public hidebysig specialname rtspecialname instance void .ctor() cil managed 
    { 
     .maxstack 8 
     L_0000: ldarg.0 // pushes "this" onto the stack 
     L_0001: ldc.i4.4 // pushes 4 (as Int32) onto the stack 
     L_0002: stfld int32 TestApp.Program/A::i // assigns to i (this.i=4) 
     L_0007: ldarg.0 // pushes "this" onto the stack 
     L_0008: ldc.r8 6 // pushes 6 (as Double) onto the stack 
     L_0011: stfld float64 TestApp.Program/A::j // assigns to j (this.j=6.0) 
     L_0016: ldarg.0 // pushes "this" onto the stack 
     L_0017: call instance void [mscorlib]System.Object::.ctor() // calls the base-ctor 
     /* if you had a custom constructor, the body would go here */ 
     L_001c: ret // and back we go 
    } 
+2

Opisany dla OP; mam nadzieję, że jest OK –

+0

Dzięki Marc. Dobry pomysł. –

0

powyższa inicjalizacja zmiennych zostanie uruchomiona jako pierwsza. Następnie wszystko, co masz w swoim konstruktorze, będzie uruchamiane po.

3

Możesz przeczytać te rzeczy w official ECMA language standard. Rozdział 17.4.5 mówi o tym konkretnym problemie, zasadniczo stwierdzając, że pola będą domyślnie inicjowane z jakąkolwiek domyślną wartością typ ma (0 lub 0.0, odpowiednio w twoim przypadku), a potem inicjalizacja wartości zostanie wykonana w kolejności, w której są zadeklarowane w pliku źródłowym.

+0

+1 za odniesienie do standardowej specyfikacji – jgauffin

Powiązane problemy