Operatori (confronto tra C# e Java)

Aggiornamento: novembre 2007

In C# sono disponibili tutti gli operatori applicabili supportati da Java, come indicato nella tabella riportata di seguito. Alla fine della tabella sono inclusi alcuni nuovi operatori disponibili in C#, ma non in Java:

Categoria

Simbolo

Unario

++--+-!~()

Moltiplicazione

*/%

Addizione

+ -

Spostamento

<< >>

Relazionali

< > <= >= instanceof

Uguaglianza

== !=

AND logico

&

XOR logico

^

OR logico

|

AND condizionale

&&

OR condizionale

||

Condizionale

? :

Assegnazione

= *= /= %= += -= <<= >>= &= ^= |=

Tipo di operando

typeof

Dimensione dell'operando

sizeof

Attivazione del controllo dell'overflow

checked

Disattivazione del controllo dell'overflow

unchecked

L'unico operatore Java non disponibile in C# è l'operatore shift (>>>). Questo operatore è disponibile in Java perché in tale linguaggio non sono presenti variabili unsigned, per i casi in cui è necessario uno spostamento a destra per inserire un 1 nei bit più significativi.

Poiché C# supporta le variabili unsigned, è sufficiente l'operatore >> standard. Questo operatore produce risultati diversi a seconda che l'operando sia signed o unsigned. Effettuando lo spostamento a destra di un numero unsigned, viene inserito 0 nel bit più significativo, mentre con lo spostamento a destra di un numero signed viene copiato il precedente bit più significativo.

Operatori checked e unchecked

Le operazioni aritmetiche determinano un overflow se il risultato è troppo esteso per il numero di bit allocati al tipo di dati in uso. È possibile verificare o ignorare tale overflow per una determinata operazione aritmetica integrale con le parole chiave checked e unchecked. Nel caso di un'espressione costante che utilizza checked, viene generato un errore in fase di compilazione.

Nel semplice esempio riportato di seguito vengono illustrati questi operatori:

class TestCheckedAndUnchecked
{
    static void Main()
    {
        short a = 10000;
        short b = 10000;

        short c = (short)(a * b);                     // unchecked by default
        short d = unchecked((short)(10000 * 10000));  // unchecked
        short e = checked((short)(a * b));            // checked - run-time error

        System.Console.WriteLine(10000 * 10000);  // 100000000
        System.Console.WriteLine(c);              // -7936
        System.Console.WriteLine(d);              // -7936
        System.Console.WriteLine(e);              // no result
    }    
}

In questo codice l'operatore unchecked consente di evitare l'errore in fase di compilazione che, altrimenti, verrebbe causato dall'istruzione riportata di seguito:

short d = unchecked((short)(10000 * 10000));  // unchecked

L'espressione che segue è unchecked per impostazione predefinita, pertanto il valore va in overflow in modo invisibile:

short c = (short)(a * b);                     // unchecked by default

Con l'operatore checked è possibile imporre la verifica dell'espressione per individuare eventuali overflow in fase di esecuzione:

short e = checked((short)(a * b));            // checked - run-time error

L'assegnazione dei primi due valori a d e c comporta un overflow invisibile con un valore pari a -7936 quando viene eseguito il programma, ma se si tenta di moltiplicare il valore per e utilizzando checked(), il programma genererà un'eccezione OverflowException.

Nota:

È anche possibile scegliere di verificare l'esistenza di un overflow aritmetico in un blocco di codice specificando l'opzione del compilatore (/checked) nella riga di comando o direttamente in Visual Studio per ogni singolo progetto.

Vedere anche

Concetti

Guida per programmatori C#

Riferimenti

Operatori di C#

Altre risorse

Linguaggio di programmazione C# per sviluppatori Java