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

    static void Main(string[] arguments) 
    { 
     var breakpoint2 = 0; 
    } 
    } 
} 
  1. Perché breakpoint 1 non è mai colpito, ma colpisce breakpoint 2 sempre?
  2. E c'è un modo per eseguire il costruttore predefinito prima di immettere Main()?
+7

Si dovrebbe leggere la differenza di metodi statici e non statici. –

risposta

22

Il metodo Main viene eseguito senza un'istanza della classe Program, che è possibile perché è un metodo statico. I metodi statici sono metodi che possono essere chiamati senza la necessità di costruire/istanziare un oggetto dalla classe. Essi possono essere chiamati direttamente sulla classe stessa in questo modo:

Program.Main(new string[0]); 

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

Il costruttore non è un metodo statico, per colpire che punto di interruzione è necessario creare un'istanza della classe Program, in questo modo:

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

alternativa è possibile make the constructor static, anche se certamente non è really that useful from a testability standpoint e implica anche che si sta andando ad avere variabili statiche (che sono disponibili a livello globale):

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

Ulteriori informazioni su static methods here.

19

Non si sta istanziando la classe. Stai utilizzando un metodo static Main(). Il tempo di esecuzione caricherà la classe e invocherà il metodo Main(). Non ha bisogno di un'istanza della classe per richiamare il metodo Main(). Il costruttore funzionerà quando costruisci (istanzia) un oggetto.

4

Il punto di accesso al programma equivale a chiamare TestApp.Program.Main(args). La classe Program non viene istanziata.

9

Il metodo è statico: verrà eseguito senza un'istanza della classe esistente. Il tuo costruttore non lo è: viene eseguito solo quando crei un'istanza della classe (ovvero, quando scrivi new Program()).

Al fine di raggiungere il punto di interruzione, molto probabilmente si desidera modificare il costruttore in modo che sia static Program().

+0

I modificatori di accesso non sono consentiti sui costruttori statici, ovvero sarebbe semplicemente 'static Program() {}', non 'public static Program() {}' –

+1

+1 per menzionare costruttori statici, sebbene non sia necessario per il pubblico poiché è chiamato implicitamente. http://msdn.microsoft.com/en-us/library/k9x6w0hc(v=vs.80).aspx –

+0

Grazie per la correzione - copia e incolla senza la dovuta attenzione! –

Problemi correlati