2009-11-06 14 views
43

perché in C#, applicazione console, in classe "programma", che è l'impostazione predefinita, tutti i metodi devono essere statico conC#: applicazione console - i metodi statici

static void Main(string[] args) 
+0

wow .. tante grandi risposte in così poco tempo ... SO .. tu rock !!! tutti voi ragazzi che avete risposto ... grazie !!! –

risposta

63

funzioni parlamentare non hanno essere statici; ma se sono non statico, è necessario istanziare un oggetto Program per chiamare un metodo membro.

Con metodi statici:

public class Program 
{ 
    public static void Main() 
    { 
     System.Console.WriteLine(Program.Foo()); 
    } 

    public static string Foo() 
    { 
     return "Foo"; 
    } 
} 

Senza metodi statici (in altre parole, che sia necessario creare un'istanza Program):

public class Program 
{ 
    public static void Main() 
    { 
     System.Console.WriteLine(new Program().Foo()); 
    } 

    public string Foo() // notice this is NOT static anymore 
    { 
     return "Foo"; 
    } 
} 

Main deve essere statico, perché altrimenti si avrebbe dovuto dire al compilatore come istanziare la classe Program, che può o non può essere un compito banale.

+1

Istanziare la classe 'Program' in una mossa intelligente in termini di memoria? se è un programma di grandi dimensioni sembra una cosa orribile da fare. – MasterMastic

23

È possibile scrivere i metodi non statici anche, appena si dovrebbe usare come questo

static void Main(string[] args) 
{ 
    Program p = new Program(); 
    p.NonStaticMethod(); 
} 

L'unico requisito per C# applicazione è che l'assemblea eseguibile deve avere un metodo statico main in qualsiasi classe nel gruppo!

11

Il metodo Main è statico perché è il punto di ingresso del codice per l'assembly. All'inizio non esiste un'istanza di alcun oggetto, solo il modello di classe caricato in memoria e i suoi membri statici incluso il metodo statico del punto di ingresso principale. Main è predefinito dal compilatore C# per essere il punto di ingresso.

Un metodo statico può chiamare solo altri metodi statici (a meno che non ci sia un handle di istanza di qualcosa composto per l'uso). Questo è il motivo per cui il metodo Main chiama altri metodi statici e perché si ottiene un errore di compilazione se si tenta di chiamare un metodo non-statico (istanza).

Tuttavia, se si crea un'istanza di qualsiasi classe, anche della classe Program stessa, quindi si inizia a creare oggetti nell'applicazione nell'area di memoria heap. È quindi possibile iniziare a chiamare i membri dell'istanza.

5

Non tutti i metodi devono essere statici, è possibile aggiungere metodi di istanza e anche creare un'istanza della classe del programma.
Ma per Main deve essere statico perché è il punto di ingresso della tua applicazione e nessuno sta per creare un'istanza e chiamarla.

1

Quindi, le risposte tecnicamente corrette sono al di sopra :)

Tengo a precisare che in genere non si vuole andare nella direzione di tutti i metodi statici. Crea un oggetto, come un modulo di Windows, un controller per esso e vai verso un codice orientato agli oggetti invece che procedurale.