C# Language selezionato, deselezionato


Esempio

Le parole chiave checked e unchecked definiscono come le operazioni gestiscono l'overflow matematico. "Overflow" nel contesto delle parole chiave checked e unchecked si verifica quando un'operazione di aritmetica intera dà come risultato un valore maggiore di grandezza rispetto a quello che il tipo di dati di destinazione può rappresentare.

Quando si verifica un overflow all'interno di un blocco checked (o quando il compilatore è impostato per utilizzare globalmente l'aritmetica controllata), viene lanciata un'eccezione per avvisare di un comportamento indesiderato. Nel frattempo, in un blocco unchecked , l'overflow è silenzioso: non vengono generate eccezioni e il valore si limita semplicemente al limite opposto. Questo può portare a bug sottili e difficili da trovare.

Dal momento che la maggior parte delle operazioni aritmetiche vengono eseguite su valori che non sono grandi o abbastanza piccoli da eccedere, la maggior parte delle volte non è necessario definire esplicitamente un blocco come checked . È necessario prestare attenzione quando si eseguono operazioni aritmetiche su input non limitati che possono causare un overflow, ad esempio quando si esegue l'aritmetica in funzioni ricorsive o mentre si immette l'input dell'utente.

checkedunchecked influiscono sulle operazioni aritmetiche in virgola mobile.

Quando un blocco o un'espressione viene dichiarato come unchecked , qualsiasi operazione aritmetica al suo interno può eccedere senza causare errori. Un esempio in cui questo comportamento è desiderato potrebbe essere il calcolo di un checksum, in cui il valore è consentito per "avvolgere" durante il calcolo:

byte Checksum(byte[] data) {
    byte result = 0;
    for (int i = 0; i < data.Length; i++) {
        result = unchecked(result + data[i]); // unchecked expression
    }
    return result;
}

Uno degli usi più comuni per unchecked è l'implementazione di una sovrascrittura personalizzata per object.GetHashCode() , un tipo di checksum. Puoi vedere l'uso della parola chiave nelle risposte a questa domanda: qual è il miglior algoritmo per un System.Object.GetHashCode sottoposto a override? .

Quando un blocco o un'espressione viene dichiarata come checked , qualsiasi operazione aritmetica che provoca un overflow genera una OverflowException generata.

int SafeSum(int x, int y) {
    checked { // checked block
        return x + y; 
    }
}

Sia selezionato che deselezionato possono essere in forma di blocco ed espressione.

I blocchi selezionati e deselezionati non influiscono sui metodi chiamati, solo gli operatori chiamati direttamente nel metodo corrente. Ad esempio, Enum.ToObject() , Convert.ToInt32() e gli operatori definiti dall'utente non sono interessati dai contesti personalizzati selezionati / non selezionati.

Nota : il comportamento predefinito di overflow predefinito (selezionato o deselezionato) può essere modificato nelle proprietà del progetto o tramite l' opzione della riga di comando / controllata [+ | -] . È normale eseguire il controllo delle operazioni di debug e deselezionare le build di rilascio. Le parole chiave checked e unchecked verranno quindi utilizzate solo laddove non si applica un approccio predefinito e per garantire la correttezza è necessario un comportamento esplicito.