Il team di progettazione C# non ha l'abitudine di aggiungere funzionalità che non sono utili alla lingua. (Con la notevole eccezione dell'operatore unario più, l'operatore più inutile del mondo.)
La parola chiave non selezionata ha due casi d'uso principali.
Innanzitutto, l'aritmetica dei numeri interi costanti è sempre selezionata per impostazione predefinita. . Questo può essere irritante.Supponiamo per esempio di avere un codice di interoperabilità e si desidera creare una costante per il HRESULT_E_FAIL:
const int E_FAIL = 0x80004005;
Questo è un errore perché quel numero è troppo grande per essere in un int
. Ma potresti non voler usare uno uint
. Si potrebbe pensare così mi limiterò a dire
const int E_FAIL = (int)0x80004005;
, ma che è anche illegale perché costante aritmetica tra cui conversioni è sempre selezionata per impostazione predefinita.
Quello che devi fare è disattivare controllata costante aritmetica via
const int E_FAIL = unchecked((int)0x80004005);
In secondo luogo, l'aritmetica di default per non costante matematica intero in C# non è selezionata, perché è più veloce, e perché questo è quello che molti altre lingue simili. Tuttavia C# consente di modificare l'impostazione predefinita per l'aritmetica controllata per la matematica dei numeri interi non costanti tramite un flag del compilatore. Se lo hai fatto, e devi disattivarlo di nuovo temporaneamente, devi utilizzare la sintassi del blocco o dell'espressione unchecked
.
Un terzo caso d'uso consiste nell'utilizzare il blocco non controllato come una forma di codice di auto-documentazione, per dire "Sono consapevole che l'operazione che sto facendo qui potrebbe traboccare, e che per me va bene." Per esempio, io scrivo spesso qualcosa di simile:
int GetHashCode()
{
unchecked
{
int fooCode = this.foo == null ? 0 : this.foo.GetHashCode();
int barCode = this.bar == null ? 0 : this.bar.GetHashCode();
return fooCode + 17 * barCode;
}
}
Il "incontrollato", sottolinea al lettore che ci aspettiamo che la moltiplicazione e l'aggiunta di codici hash potrebbero traboccare, e che questo è OK.
tua seconda domanda è:
Qual è la differenza tra questi due approcci per gestire troppo pieno?
Buona domanda.
Se nel vostro contesto selezionato intendete: Mi aspetto che l'aritmetica sia sempre entro i limiti; se non lo è, il mio programma ha un bug grave e deve essere terminato prima che faccia più danno al mondo quindi non si dovrebbe fare alcun controllo di overflow, perché non ci sono overflow. Qualsiasi eccezione dovrebbe terminare il programma; il contesto controllato sta semplicemente facendo funzionare il runtime per verificare la correttezza del codice.
Se nel vostro contesto controllato intendi mi richiedono l'aritmetica di essere all'interno dei limiti, ma ho ottenuto questi dati da una fonte inaffidabile e io sono troppo pigro per fare il controllo dei limiti su di esso allora si dovrebbe intercettare l'eccezione. Tuttavia,, la soluzione migliore sarebbe eseguire il controllo dell'intervallo e fornire un errore più significativo se i dati sono fuori intervallo, piuttosto che fare in modo che il runtime noti il problema e generare un'eccezione di overflow. Raccomando vivamente il controllo della portata piuttosto che prendere un'eccezione; non essere pigro.
'if (value> Int32.MaxValue)' --- questa condizione dovrebbe essere vera per alcuni valori "interi"? – zerkms
Le implementazioni personalizzate di 'GetHashCode' sono buoni esempi di scenari in cui' deselezionata' può essere utile, ovvero http://stackoverflow.com/a/263416/1644813 –
se (valore> INT32.MaxValue) ritorna True, penso –