Overload degli operatori (confronto tra C# e Java)

Aggiornamento: novembre 2007

Analogamente a C++, C# consente di eseguire l'overload degli operatori da utilizzare sulle proprie classi. In questo modo è possibile utilizzare tipi di dati definiti dall'utente in modo altrettanto naturale e logico dei tipi di dati di base. È possibile ad esempio creare un nuovo tipo di dati denominato ComplexNumber per rappresentare un numero complesso e fornire metodi per eseguire operazioni matematiche su tali numeri utilizzando gli operatori aritmetici standard, ad esempio l'operatore + per aggiungere due numeri complessi.

Per eseguire l'overload di un operatore, è necessario scrivere una funzione che abbia il nome dell'operatore seguito dal simbolo dell'operatore di cui si desidera eseguire l'overload. Nell'esempio riportato di seguito viene eseguito l'overload dell'operatore +:

public static ComplexNumber operator+(ComplexNumber a, ComplexNumber b)

Tutti gli overload degli operatori sono metodi statici della classe. Inoltre, se si esegue l'overload dell'operatore di uguaglianza (==), è necessario eseguire l'overload anche dell'operatore di disuguaglianza (!=). Anche gli operatori < e >, così come gli operatori <= e >=, devono essere sottoposti a overload in coppie.

Di seguito è riportato l'elenco completo degli operatori di cui è possibile eseguire l'overload.

  • Operatori unari: +, -, !, ~, ++, --, true, false

  • Operatori binari: +, -, *, /, %, &, |, ^, <<, >>, ==, !=, >, <, >=, <=

Nell'esempio di codice riportato di seguito viene creata una classe ComplexNumber che esegue l'overload degli operatori + e -:

public class ComplexNumber
{
    private int real;
    private int imaginary;

    public ComplexNumber() : this(0, 0)  // constructor
    {
    }

    public ComplexNumber(int r, int i)  // constructor
    {
        real = r;
        imaginary = i;
    }

    // Override ToString() to display a complex number in the traditional format:
    public override string ToString()
    {
        return(System.String.Format("{0} + {1}i", real, imaginary));
    }

    // Overloading '+' operator:
    public static ComplexNumber operator+(ComplexNumber a, ComplexNumber b)
    {
        return new ComplexNumber(a.real + b.real, a.imaginary + b.imaginary);
    }

    // Overloading '-' operator:
    public static ComplexNumber operator-(ComplexNumber a, ComplexNumber b)
    {
        return new ComplexNumber(a.real - b.real, a.imaginary - b.imaginary);
    }
}

Questa classe consente di creare e modificare due numeri complessi utilizzando codice come quello riportato di seguito:

class TestComplexNumber
{
    static void Main()
    {
        ComplexNumber a = new ComplexNumber(10, 12);
        ComplexNumber b = new ComplexNumber(8, 9);

        System.Console.WriteLine("Complex Number a = {0}", a.ToString());
        System.Console.WriteLine("Complex Number b = {0}", b.ToString());

        ComplexNumber sum = a + b;
        System.Console.WriteLine("Complex Number sum = {0}", sum.ToString());

        ComplexNumber difference = a - b;
        System.Console.WriteLine("Complex Number difference = {0}", difference.ToString());
    }
}

Come mostrato dal programma, è ora possibile utilizzare gli operatori più e meno sugli oggetti appartenenti alla classe ComplexNumber in modo intuitivo. L'output ottenuto è il seguente:

Complex Number a = 10 + 12i

Complex Number b = 8 + 9i

Complex Number sum = 18 + 21i

Complex Number difference = 2 + 3i

Java non supporta l'overload degli operatori, benché venga eseguito internamente l'overload dell'operatore + per la concatenazione delle stringhe.

Vedere anche

Attività

Esempio di overload dell'operatore

Concetti

Guida per programmatori C#

Riferimenti

Operatori che supportano l'overload (Guida per programmatori C#)

Altre risorse

Linguaggio di programmazione C# per sviluppatori Java