2013-06-05 16 views
14
namespace TestApp 
{ 
    class Program 
    { 
    public Program() 
    { 
     var breakpoint1 = 0; 
    } 

    static void Main(string[] arguments) 
    { 
     var breakpoint2 = 0; 
    } 
    } 
} 
  1. Dlaczego breakpoint 1 nigdy nie jest trafiony, ale to uderza breakpoint 2 zawsze?
  2. I czy istnieje sposób na wykonanie domyślnego konstruktora przed wprowadzeniem Main()?
+7

Powinieneś przeczytać o różnicy metod statycznych i niestatycznych. –

Odpowiedz

22

Metoda Main jest wykonywana bez instancji klasy Program, co jest możliwe, ponieważ jest to metoda statyczna. Metody statyczne to metody, które można wywoływać bez potrzeby konstruowania/tworzenia instancji obiektu z klasy. Mogą być wywoływane bezpośrednio na samej klasy jak poniżej:

Program.Main(new string[0]); 

// executes the Main static method on Program class 
// with empty string array as argument 

Konstruktor nie jest metoda statyczna, uderzy to przerwania trzeba instancję klasy Program, tak:

static void Main(string[] arguments) 
{ 
    var breakpoint2 = 0; 
    new Program(); // breakpoint1 will be hit 
} 

Alternatywnie można make the constructor static, choć trzeba przyznać, że nie jest really that useful from a testability standpoint a także sugeruje, że masz zamiar mieć zmienne statyczne (które są dostępne globalnie):

static Program() { 
    var breakpoint1 = 0; 
    // breakpoint will be hit without an instance of the Program class 
} 

Możesz przeczytać więcej o static methods here.

19

Nie tworzysz instancji klasy. Używasz metody static Main(). Czas działania załaduje klasę i wywoła metodę Main(). Nie potrzebuje instancji klasy, aby wywołać metodę Main(). Konstruktor uruchomi się podczas konstruowania (tworzenie instancji) obiektu.

4

Punkt wejścia do programu jest równoważny wywołaniu TestApp.Program.Main(args). Klasa Program nie zostanie utworzona.

9

Twoja metoda jest statyczna: będzie działać bez wystąpienia klasy. Twój konstruktor nie jest: jest wykonywany tylko wtedy, gdy tworzysz instancję klasy (to znaczy, gdy piszesz new Program()).

Aby trafić w punkt przerwania, najprawdopodobniej chcesz zmienić konstruktora na static Program() zamiast tego.

+0

Modyfikatory dostępu są niedozwolone w przypadku konstruktorów statycznych, tzn. Po prostu statyczny Program() {} ', a nie' public static Program() {} ' –

+1

+1, aby wspomnieć konstruktory statyczne, chociaż nie ma potrzeby wprowadzania publicznych ponieważ jest on nazywany niejawnie. http://msdn.microsoft.com/en-us/library/k9x6w0hc(v=vs.80).aspx –

+0

Dzięki za poprawkę - kopiowanie i wklejanie bez należytej uwagi! –

Powiązane problemy