1 using System;
2
3 class Foo
4 {
5 public Foo()
6 {
7 Console.WriteLine(this.ToString());
8 }
9 }
10
11 class Bar1 : Foo
12 {
13 private int i;
14
15 public Bar1()
16 {
17 i = 123;
18 }
19
20 public override string ToString()
21 {
22 return i.ToString();
23 }
24 }
25
26 class Bar2 : Foo
27 {
28 private int i = 123;
29
30 public Bar2()
31 {
32 }
33
34 public override string ToString()
35 {
36 return i.ToString();
37 }
38 }
39
40 class Program
41 {
42 static void Main()
43 {
44 new Bar1();
45 new Bar2();
46 }
47 }
Qual a saída do programa acima?
a) 123
0
b) 0
123
c) A compilação falha.
d) É lançado um erro em tempo de execução;
fonte: http://community.bartdesmet.net/blogs/bart/archive/2007/01/08/Answers-to-C_2300_-Quiz-_2D00_-Field-initialization.aspx
Resposta: b)
A forma com que os construtores são chamados em C# é a mesma de JAVA.
As variáveis globais são inicializadas antes da chamada do construtor.
A primeira chamada do construtor da classe invoca o construtor superior. Assim o construtor da classe Foo é invocado e chama o método toString do objeto em memória.
Como em Bar1 a atribuição so ocorre após a chamada do construtor super a saída é 0.