Metodi (Guida per programmatori C#)

Aggiornamento: novembre 2007

Un metodo è un blocco di codice contenente una serie di istruzioni. Un programma provvede ad eseguire le istruzioni chiamando il metodo e specificando qualsiasi argomento richiesto dal metodo. In C# ogni istruzione viene eseguita nel contesto di un metodo. Il metodo Main è il punto di ingresso per ogni applicazione C#. Tale metodo viene chiamato dal Common Language Runtime (CLR) al momento in cui il programma viene avviato.

Nota:

In questo argomento vengono illustrati i metodi denominati. Per ulteriori informazioni sulle funzioni anonime, vedere Funzioni anonime (Guida per programmatori C#).

Firme di un metodo

I metodi vengono dichiarati in una classe o in una struttura specificando il livello di accesso come public o private, eventuali modificatori opzionali come abstract o sealed, il valore restituito, il nome del metodo e tutti i parametri del metodo. Queste parti rappresentano la firma del metodo.

Nota:

Un tipo restituito di un metodo non fa parte della firma del metodo per gli scopi di overload dei metodi. Tuttavia, fa parte della firma del metodo quando si determina la compatibilità tra un delegato e il metodo a cui punta.

I parametri sono racchiusi tra parentesi e separati da virgole. Le parentesi vuote indicano che il metodo non richiede parametri. Questa classe contiene tre metodi:

abstract class Motorcycle
{
    // Anyone can call this.
    public void StartEngine() {/* Method statements here */ }

    // Only derived classes can call this.
    protected void AddGas(int gallons) { /* Method statements here */ }

    // Derived classes can override the base class implementation.
    public virtual int Drive(int miles, int speed) { /* Method statements here */ return 1; }

    // Derived classes must implement this.
    public abstract double GetTopSpeed(); 
}

Metodo di accesso

La chiamata a un metodo su un oggetto è simile all'accesso a un campo. Dopo il nome dell'oggetto è necessario aggiungere un punto, il nome del metodo e le parentesi. Gli argomenti sono riportati tra parentesi e separati da virgole. I metodi della classe Motorcycle possono pertanto essere chiamati come illustrato nell'esempio seguente:

class TestMotorcycle : Motorcycle
{

    public override double GetTopSpeed()
    {
        return 108.4;
    }

    static void Main()
    {

        TestMotorcycle moto = new TestMotorcycle();

        moto.StartEngine();
        moto.AddGas(15);
        moto.Drive(5, 20);
        double speed = moto.GetTopSpeed();
        Console.WriteLine("My top speed is {0}", speed);            
    }
}

Parametri di un metodo rispetto agli argomenti

La definizione del metodo specifica il nome e il tipo di qualsiasi parametro richiesto. Quando il codice chiamante effettua la chiamata del metodo, fornisce valori concreti denominati argomenti per ciascun parametro. Gli argomenti devono essere compatibili con il tipo del parametro, tuttavia il nome dell'argomento (se presente) utilizzato nel codice chiamante non deve corrispondere al nome del parametro definito nel metodo. Esempio:

public void Caller()
{
    int numA = 4;
    // Call with an int variable.
    int productA = Square(numA);

    int numB = 32;
    // Call with another int variable.
    int productB = Square(numB);

    // Call with an integer literal.
    int productC = Square(12);

    // Call with an expression that evaulates to int.
    productC = Square(productA * 3);
}

int Square(int i)
{
    // Store input argument in a local variable.
    int input = i;
    return input * input;
}

Passaggio per riferimento rispetto al passaggio per valore

Per impostazione predefinita, quando un tipo di valore viene passato a un metodo, viene passata una copia anziché l'oggetto stesso. Pertanto, modifiche all'argomento non hanno effetto sulla copia originale nel metodo chiamante. È possibile passare un tipo-valore per riferimento tramite la parola chiave ref. Per ulteriori informazioni, vedere la classe Passaggio di parametri di tipi di valore (Guida per programmatori C#). Per un elenco dei tipi incorporati, vedere Tabella dei tipi di valore (Riferimenti per C#).

I tipi di riferimento vengono passati per riferimento. Quando un oggetto di un tipo di riferimento viene passato ad un metodo, il riferimento punta all'oggetto originale, non a una copia. Le modifiche apportate tramite questo riferimento si rifletteranno pertanto nel metodo chiamante. Viene creato un tipo riferimento utilizzando la parola chiave class come illustrato nell'esempio seguente:

public class SampleRefType
{
    public int value;
}

Se un oggetto basato su questo tipo viene passato a un metodo, verrà passato per riferimento. Esempio:

public static void TestRefType()
{
    SampleRefType rt = new SampleRefType();
    rt.value = 44;
    ModifyObject(rt);
    Console.WriteLine(rt.value);
}
static void ModifyObject(SampleRefType obj)
{
    obj.value = 33;
}

In questo esempio viene eseguita essenzialmente la stessa operazione dell'esempio precedente, con la differenza che, poiché viene utilizzato un tipo riferimento, la modifica effettuata da ModifyObject viene apportata all'oggetto creato nel metodo TestRefType. Il metodo TestRefType visualizzerà quindi il valore 33.

Per ulteriori informazioni, vedere°Passaggio di parametri di tipi di riferimento (Guida per programmatori C#) e Tipi di riferimento (Riferimenti per C#).

Valori restituiti

I metodi possono restituire un valore al chiamante. Se il tipo restituito, ossia il tipo indicato prima del nome del metodo, non è void, il metodo può restituire il valore tramite la parola chiave return. Un'istruzione con la parola chiave return seguita da un valore che corrisponde al tipo restituito restituirà tale valore al chiamante del metodo. La parola chiave return determina anche l'interruzione dell'esecuzione del metodo. Se il tipo restituito è void, un'istruzione return senza alcun valore è comunque utile per interrompere l'esecuzione del metodo. Senza la parola chiave return, l'esecuzione del metodo viene interrotta quando viene raggiunta la fine del blocco di codice. Nei metodi con un tipo restituito non void deve essere utilizzata la parola chiave return per consentire la restituzione di un valore. Questi due metodi utilizzano ad esempio la parola chiave return per restituire valori integer:

class SimpleMath
{
    public int AddTwoNumbers(int number1, int number2)
    {
        return number1 + number2;
    }

    public int SquareANumber(int number)
    {
        return number * number;
    }
}

Per utilizzare un valore restituito da un metodo, il metodo chiamante può utilizzare la chiamata al metodo in qualsiasi punto in cui sarebbe sufficiente un valore dello stesso tipo. È inoltre possibile assegnare il valore restituito a una variabile. Nei due esempi di codice riportati di seguito viene ottenuto lo stesso risultato:

int result = obj.AddTwoNumbers(1, 2);
obj.SquareANumber(result);
obj.SquareANumber(obj.AddTwoNumbers(1, 2));

L'utilizzo di una variabile locale, in questo caso result, per l'archiviazione di un valore è facoltativo. Può contribuire alla leggibilità del codice, oppure potrebbe essere necessario per archiviare il valore originale dell'argomento per l'intero ambito del metodo.

Per ulteriori informazioni, vedere la classe return (Riferimenti per C#).

Specifiche del linguaggio C#

Per ulteriori informazioni, vedere le seguenti sezioni incluse in Specifiche del linguaggio C#:

  • 1.6.6 Metodi

  • 10.6 Metodi

Vedere anche

Concetti

Guida per programmatori C#

Riferimenti

Classi e strutture (Guida per programmatori C#)

Modificatori di accesso (Guida per programmatori C#)

Classi statiche e membri di classi statiche (Guida per programmatori C#)

Ereditarietà (Guida per programmatori C#)

Classi e membri delle classi astratte e sealed (Guida per programmatori C#)

params (Riferimenti per C#)

return (Riferimenti per C#)

out (Riferimenti per C#)

ref (Riferimenti per C#)

Passaggio di parametri (Guida per programmatori C#)