Main () e altri metodi (confronto tra C# e Java)
Aggiornamento: novembre 2007
In questa sezione viene fornita una descrizione dei metodi e viene illustrato come i parametri dei metodi vengono passati per riferimento e per valore.
Metodo Main ()
Ogni applicazione C# deve contenere un unico metodo Main che specifica l'inizio dell'esecuzione del programma. In C# Main è con l'iniziale maiuscola, mentre in Java viene utilizzato main tutto minuscolo.
Main può restituire solo int o void e dispone di un argomento matrice di stringhe facoltativo per rappresentare i parametri della riga di comando:
static int Main(string[] args)
{
//...
return 0;
}
Il parametro matrice di stringhe contenente gli eventuali argomenti della riga di comando passati funziona come in Java. Di conseguenza, args[0] specifica il primo parametro della riga di comando, args[1] il secondo e così via. Diversamente da C++, la matrice args non contiene il nome del file EXE.
Altri metodi
I parametri possono essere passati a un metodo per valore o per riferimento. I parametri per valore assumono semplicemente il valore di qualsiasi variabile e lo utilizzano nel metodo. Di conseguenza, il valore della variabile nel codice chiamante non viene modificato dalle azioni eseguite sui parametri all'interno di un metodo.
I parametri per riferimento puntano invece a una variabile dichiarata nel codice chiamante. Di conseguenza, i metodi modificano il contenuto della variabile, se passata per riferimento.
Passaggio per riferimento
Sia in Java che in C# i parametri dei metodi che fanno riferimento a un oggetto vengono sempre passati per riferimento, mentre i parametri dei tipi di dati primitivi (tipi valore in C#) vengono passati per valore.
In C#, per passare un tipo valore per riferimento, è necessario specificare la parola chiave ref o out. La differenza tra queste due parole chiave consiste nell'inizializzazione dei parametri. I parametri ref devono essere inizializzati prima dell'utilizzo, mentre i parametri out non devono essere inizializzati in modo esplicito prima di essere passati e gli eventuali valori precedenti vengono ignorati.
Parola chiave ref
Specificare questa parola chiave in un parametro di tipo valore se si desidera che il metodo chiamato modifichi in modo definitivo il valore delle variabili utilizzate come parametri. In questo modo, anziché il valore di una variabile utilizzata nella chiamata, viene passato un riferimento alla variabile. Il metodo agisce quindi sul riferimento, in modo che le modifiche apportate al parametro durante l'esecuzione del metodo vengano mantenute nella variabile originaria utilizzata come parametro per il metodo.
Nel codice riportato di seguito questa procedura viene illustrata con il metodo Add, in cui il secondo parametro int viene passato per riferimento con la parola chiave ref:
class TestRef
{
private static void Add(int i, ref int result)
{
result += i;
return;
}
static void Main()
{
int total = 20;
System.Console.WriteLine("Original value of 'total': {0}", total);
Add(10, ref total);
System.Console.WriteLine("Value after calling Add(): {0}", total);
}
}
L'output di questo semplice esempio dimostra che le modifiche apportate al parametro result vengono estese alla variabile total utilizzata nella chiamata al metodo Add :
Original value of 'total': 20
Value after calling Add(): 30
Questo avviene perché il parametro result fa riferimento all'effettiva posizione di memoria occupata dalla variabile total nel codice chiamante. Poiché una proprietà di una classe non è una variabile, non può essere utilizzata direttamente come parametro ref.
La parola chiave ref deve precedere il parametro nella chiamata al metodo e nella relativa dichiarazione.
Parola chiave out
La parola chiave out produce un effetto molto simile alla parola chiave ref e le modifiche apportate a un parametro dichiarato con out saranno visibili anche all'esterno del metodo. Questa parola chiave presenta due differenze rispetto a ref. Innanzitutto, qualsiasi valore iniziale di un parametro out viene ignorato nel metodo. In secondo luogo, durante il metodo deve essere assegnato un parametro out:
class TestOut
{
private static void Add(int i, int j, out int result)
{
// The following line would cause a compile error:
// System.Console.WriteLine("Initial value inside method: {0}", result);
result = i + j;
return;
}
static void Main()
{
int total = 20;
System.Console.WriteLine("Original value of 'total': {0}", total);
Add(33, 77, out total);
System.Console.WriteLine("Value after calling Add(): {0}", total);
}
}
In questo caso il terzo parametro del metodo Add viene dichiarato con la parola chiave out e anche le chiamate al metodo richiedono la parola chiave out per il parametro. L'output sarà il seguente:
Original value of 'total': 20
Value after calling Add(): 110
In sintesi, utilizzare la parola chiave ref se si desidera che un metodo modifichi una variabile esistente e la parola chiave out per restituire un valore generato all'interno del metodo. Viene in genere utilizzata insieme al valore restituito del metodo quando quest'ultimo genera più valori per il codice chiamante.
Vedere anche
Concetti
Main() e gli argomenti della riga di comando (Guida per programmatori C#)
Riferimenti
Passaggio di parametri (Guida per programmatori C#)