2012-11-06 11 views
10

Eventuali duplicati:
Why don’t languages raise errors on integer overflow by default?Perché C# non usa il controllo di overflow aritmetico per impostazione predefinita?

Perché non C# usa overflow aritmetico controllo di default?

Immagino che in genere sarebbe meglio fare in modo che si verifichino eccezioni in modo che gli errori non vengano oscurati. So che occasionalmente è utile sfruttare il comportamento di "involucro" che si verifica, ma la parola chiave unchecked potrebbe essere utilizzata in queste circostanze per rendere esplicite le intenzioni.

Mi aspetto che questa decisione sia stata presa intenzionalmente, forse per aumentare la compatibilità con altri linguaggi basati su C.

+2

Prestazioni .... – Mysticial

+4

Probabilmente per motivi di prestazioni: il controllo di overflow è lento e non necessario nella stragrande maggioranza dei casi. –

+0

@MichaelPetito, grazie; questa domanda sembra migliore di questa e ha buone risposte, quindi penso che dovrebbe essere chiusa. – Sam

risposta

12

Il linguaggio C# Specification dice questo:

Per le espressioni non costanti (espressioni che vengono valutate in run-time) che non sono racchiusi da alcun checked o unchecked operatori o dichiarazioni, l'overflow di default il contesto di controllo è unchecked a meno che fattori esterni (come gli switch del compilatore e la configurazione dell'ambiente di esecuzione ) richiedano la valutazione checked.

Il motivo di questa scelta è probabilmente la prestazione. Sono d'accordo sul fatto che questa decisione porti ad errori tra coloro che non sono consapevoli di un overflow di tipo "silenzioso".

Se i file C# appartengono a un file di progetto C# (*.csproj), il file mantiene la configurazione del contesto di controllo di overflow "predefinito". Per modificarlo, vedere Per impostare questa opzione del compilatore nell'ambiente di sviluppo Visual Studio in this page.

Se non si utilizzano i file .csproj, probabilmente si sta compilando tutto dalla riga di comando, quindi la pagina sopra indica l'opzione della riga di comando da utilizzare per impostare il contesto di controllo di overflow predefinito.

2

Vedere la mia risposta alla domanda simile qui: Best way to handle Integer overflow in C#?

... c'è un'opzione del compilatore C# che definisce come le espressioni di fuori di controllati e incontrollato vengono gestiti:/controllato.

Il comportamento predefinito è adatto per la maggior parte delle applicazioni. Per altre applicazioni, dove il controllo rigoroso dovrebbe essere l'impostazione predefinita, esiste un'opzione del compilatore per abilitare tale comportamento.

+0

Grazie per aver trovato il tempo di rispondere, ma ho chiesto * perché * piuttosto che * come *. – Sam

+0

@Sam Grazie per il downvoting di un post pertinente, ma la risposta banale alla tua domanda è "perché Microsoft l'ha implementata così" ... –

+1

@ H2CO3 No, se stavo progettando un linguaggio, avrei impostato di default anche l'overflow. Perché? Perché l'impatto sulle prestazioni del controllo di overflow è veramente ** quello ** estremo. – Mysticial

Problemi correlati