2012-11-06 6 views
10

Powiel możliwe:
Why don’t languages raise errors on integer overflow by default?Dlaczego funkcja C# nie używa domyślnie sprawdzania przepełnienia arytmetycznego?

Dlaczego nie C# używać przepełnienie sprawdzanie domyślnie?

Uważam, że generalnie byłoby lepiej mieć wyjątki, gdy tak się dzieje, aby błędy nie były zasłonięte. Wiem, że czasami przydaje się wykorzystanie zachowań "opakowujących", ale słowo kluczowe "unchecked" może być użyte w tych okolicznościach do wyraźnego wyrażenia intencji.

Spodziewam się, że decyzja ta została podjęta celowo, być może w celu zwiększenia kompatybilności z innymi językami opartymi na języku C.

+2

Wydajność ... – Mysticial

+4

Prawdopodobnie ze względu na wydajność - kontrola przepełnienia jest powolna i nie jest wymagana w zdecydowanej większości przypadków. –

+0

@MichaelPetito, dzięki; to pytanie wydaje się lepsze niż to, i ma dobre odpowiedzi, więc myślę, że to powinno zostać zamknięte. – Sam

Odpowiedz

12

C# Language Specification mówi tak:

do wyrażenia non-stałych (wyrażeń, które są wyceniane w run-time), które nie są zamknięte w jakikolwiek checked lub unchecked operatorów lub oświadczeń, domyślnym przepełnienia Sprawdzanie kontekstu to unchecked , chyba że czynniki zewnętrzne (takie jak przełączniki kompilatora i wykonanie konfiguracja środowiska) wymagają oceny checked.

Powodem tego wyboru jest prawdopodobnie wydajność. Zgadzam się, że ta decyzja prowadzi do błędów wśród osób, które nie są świadome "cichego" przepełnienia liczby całkowitej.

Jeśli twoje pliki C# należą do pliku projektu C# (*.csproj), plik ten zawiera konfigurację "domyślnego" kontekstu sprawdzania przepełnienia. Aby go zmienić, zobacz Aby ustawić tę opcję kompilatora w środowisku programistycznym Visual Studio w this page.

Jeśli nie używasz plików .csproj, prawdopodobnie kompilujesz wszystko z wiersza poleceń, a następnie powyższa strona pokazuje, jakiej opcji wiersza poleceń należy użyć, aby ustawić domyślny kontekst sprawdzania przepełnienia.

2

Zobacz moją odpowiedź na podobne pytanie tutaj: Best way to handle Integer overflow in C#?

... tam jest opcja kompilatora C#, który definiuje sposób wyrażenia poza sprawdzone i zaznaczone są obsługiwane:/sprawdzane.

Domyślne zachowanie jest odpowiednie dla większości aplikacji. W przypadku innych aplikacji, gdzie ścisłe sprawdzanie powinno być domyślne, dostępna jest opcja kompilatora, aby włączyć takie zachowanie.

+0

Dzięki za poświęcenie czasu na odpowiedź, ale zapytałem * dlaczego * zamiast * jak *. – Sam

+0

@Sam Dzięki za zaniedbanie odpowiedniego posta, ale banalna odpowiedź na twoje pytanie brzmi: "ponieważ Microsoft zaimplementował to" ... –

+1

@ H2CO3 Nie, jeśli projektowałem język, domyślnie zawijam również w przypadku przepełnienia. Czemu? Ponieważ wpływ sprawdzania przepełnienia na wydajność jest naprawdę ** taki ekstremalny. – Mysticial

Powiązane problemy