pernyataan yang dicentang dan tidak dicentang (referensi C#)
Pernyataan checked
dan unchecked
menentukan konteks pemeriksaan luapan untuk operasi dan konversi aritmatika jenis integral. Ketika luapan aritmatika bilangan bulat terjadi, konteks pemeriksaan luapan menentukan apa yang terjadi. Dalam konteks yang dicentang, System.OverflowException dilemparkan; jika luapan terjadi dalam ekspresi konstanta, kesalahan waktu kompilasi terjadi. Dalam konteks yang tidak dicentang, hasil operasi dipotong dengan membuang bit berurutan tinggi yang tidak sesuai dengan jenis tujuan. Misalnya, dalam kasus penambahan itu membungkus dari nilai maksimum ke nilai minimum. Contoh berikut menunjukkan operasi yang sama dalam konteks yang dicentang dan tidak dicentang:
uint a = uint.MaxValue;
unchecked
{
Console.WriteLine(a + 3); // output: 2
}
try
{
checked
{
Console.WriteLine(a + 3);
}
}
catch (OverflowException e)
{
Console.WriteLine(e.Message); // output: Arithmetic operation resulted in an overflow.
}
Catatan
Perilaku operator dan konversi yang ditentukan pengguna dalam kasus luapan dapat berbeda dari yang dijelaskan dalam paragraf sebelumnya. Secara khusus, operator yang diperiksa yang ditentukan pengguna mungkin tidak memberikan pengecualian dalam konteks yang diperiksa.
Untuk informasi selengkapnya, lihat bagian Luapan dan pembagian Aritmatika berdasarkan nol dan operator yang diperiksa yang ditentukan pengguna dari artikel Operator aritmatika.
Untuk menentukan konteks pemeriksaan luapan untuk ekspresi, Anda juga dapat menggunakan checked
operator dan unchecked
, seperti yang ditunjukkan contoh berikut:
double a = double.MaxValue;
int b = unchecked((int)a);
Console.WriteLine(b); // output: -2147483648
try
{
b = checked((int)a);
}
catch (OverflowException e)
{
Console.WriteLine(e.Message); // output: Arithmetic operation resulted in an overflow.
}
Pernyataan checked
dan unchecked
dan operator hanya memengaruhi konteks pemeriksaan luapan untuk operasi yang secara tekstual di dalam blok pernyataan atau tanda kurung operator, seperti yang ditunjukkan contoh berikut:
int Multiply(int a, int b) => a * b;
int factor = 2;
try
{
checked
{
Console.WriteLine(Multiply(factor, int.MaxValue)); // output: -2
}
}
catch (OverflowException e)
{
Console.WriteLine(e.Message);
}
try
{
checked
{
Console.WriteLine(Multiply(factor, factor * int.MaxValue));
}
}
catch (OverflowException e)
{
Console.WriteLine(e.Message); // output: Arithmetic operation resulted in an overflow.
}
Pada contoh sebelumnya, pemanggilan Multiply
pertama fungsi lokal menunjukkan bahwa checked
pernyataan tidak memengaruhi konteks pemeriksaan luapan dalam fungsi karena Multiply
tidak ada pengecualian yang dilemparkan. Pada pemanggilan Multiply
fungsi kedua, ekspresi yang menghitung argumen kedua fungsi dievaluasi dalam konteks yang diperiksa dan menghasilkan pengecualian karena secara tekstual di dalam blok checked
pernyataan.
Operasi yang dipengaruhi oleh konteks pemeriksaan luapan
Konteks pemeriksaan luapan memengaruhi operasi berikut:
Operator aritmatika bawaan berikut: operator unary ,
--
-
dan biner+
++
, ,-
,*
dan , dan/
, ketika operand mereka adalah jenis integral (yaitu, jenis numerik atau karakter integral) atau jenis enum.Konversi numerik eksplisit antara jenis integral atau dari
float
ataudouble
ke jenis integral.Catatan
Saat Anda mengonversi
decimal
nilai ke jenis integral dan hasilnya berada di luar rentang jenis tujuan, nilai OverflowException selalu dilemparkan, terlepas dari konteks pemeriksaan luapan.Dimulai dengan C# 11, operator dan konversi yang diperiksa yang ditentukan pengguna. Untuk informasi selengkapnya, lihat bagian Operator yang diperiksa yang ditentukan pengguna dari artikel Operator aritmatika.
Konteks pemeriksaan luapan default
Jika Anda tidak menentukan konteks pemeriksaan luapan, nilai opsi pengkompilasi CheckForOverflowUnderflow menentukan konteks default untuk ekspresi non-konstanta. Secara default, nilai opsi tersebut tidak diatur dan operasi dan konversi aritmatika jenis integral dijalankan dalam konteks yang tidak dicentang .
Ekspresi konstan dievaluasi secara default dalam konteks yang diperiksa dan kesalahan waktu kompilasi terjadi dalam kasus luapan. Anda dapat secara eksplisit menentukan konteks yang tidak dicentang untuk ekspresi konstanta dengan unchecked
pernyataan atau operator.
Spesifikasi bahasa C#
Untuk informasi selengkapnya, lihat bagian berikut dari spesifikasi bahasa C#:
- Pernyataan yang dicentang dan tidak dicentang
- Operator yang diperiksa dan tidak
- Operator yang dicentang dan tidak dicentang oleh pengguna - C# 11
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk