Baca dalam bahasa Inggris

Bagikan melalui


Pernyataan yang dicentang dan tidak dicentang (referensi C#)

Pernyataan checked dan unchecked menentukan konteks pemeriksaan luapan untuk operasi dan konversi aritmatika jenis integral. Pernyataan defaultnya adalah unchecked. Ketika luapan aritmatika bilangan bulat terjadi, konteks pemeriksaan luapan menentukan apa yang terjadi. Dalam konteks yang dicentang, System.OverflowException dilempar; jika luapan terjadi dalam ekspresi konstan, kesalahan kompilasi terjadi. Dalam konteks yang tidak dicentang, hasil operasi dipotong dengan membuang bit tingkat tinggi yang tidak sesuai dengan tipe tujuan. Misalnya, dalam penambahan, nilai dapat berputar dari nilai maksimum kembali ke nilai minimum. Contoh berikut menunjukkan operasi yang sama dalam konteks yang dicentang dan tidak dicentang:

C#
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 luapan operator dan konversi yang ditentukan oleh pengguna 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 aritmatika dan pembagian oleh nol dan operator yang diperiksa buatan pengguna dari artikel Operator Aritmatika.

Untuk menentukan konteks pemeriksaan kelebihan muatan untuk ekspresi, Anda juga dapat menggunakan operator checked dan unchecked, seperti yang ditunjukkan contoh berikut:

C#
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 serta operator hanya memengaruhi konteks pemeriksaan luapan untuk operasi yang secara tekstual berada di dalam blok pernyataan atau tanda kurung operator, seperti yang ditunjukkan dalam contoh berikut:

C#
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 pertama dari fungsi lokal Multiply menunjukkan bahwa pernyataan checked tidak memengaruhi konteks pemeriksaan luapan dalam fungsi Multiply karena tidak ada pengecualian yang dilemparkan. Pada pemanggilan kedua fungsi Multiply, ekspresi yang menghitung argumen kedua fungsi dievaluasi dalam konteks yang diperiksa dan menghasilkan pengecualian karena berada secara tekstual di dalam blok pernyataan checked.

Perilaku checked dan unchecked tergantung pada jenis dan operasi. Bahkan untuk bilangan bulat, operasi seperti unchecked(x / 0) selalu dilemparkan karena tidak ada perilaku yang masuk akal. Periksa perilaku untuk jenis dan operasi agar memahami bagaimana checked dan unchecked kata kunci memengaruhi kode Anda.

Jenis numerik dan konteks pemeriksaan luapan

Kata kunci checked dan unchecked terutama berlaku untuk jenis integral dengan perilaku luapan yang masuk akal. Perilaku wraparound di mana T.MaxValue + 1 menjadi T.MinValue masuk akal dalam nilai pelengkap dua. Nilai yang diwakili tidak benar karena tidak dapat muat dalam penyimpanan untuk tipe data tersebut. Oleh karena itu, bit-bit tersebut mewakili n-bit bagian bawah dari hasil secara keseluruhan.

Untuk jenis seperti decimal, float, double, dan Half yang mewakili nilai yang lebih kompleks atau nilai komplemen satu, tidak masuk akal untuk menggunakan wraparound. Ini tidak dapat digunakan untuk menghitung hasil yang lebih besar atau lebih akurat, jadi unchecked tidak bermanfaat.

float, double, dan Half memiliki nilai jenuh yang masuk akal untuk PositiveInfinity dan NegativeInfinity, sehingga Anda dapat mendeteksi overflow dalam konteks unchecked. Untuk decimal, tidak ada batasan seperti itu, dan mencapai titik jenuh pada MaxValue dapat menyebabkan kesalahan atau kebingungan. Operasi yang menggunakan decimal melempar dalam konteks checked dan unchecked.

Operasi yang terpengaruh oleh konteks pemeriksaan kelebihan arus

Konteks pemeriksaan kelebihan memengaruhi operasi-operasi berikut:

  • Operator aritmatika bawaan berikut: operator unary ++, --, - dan operator biner +, -, *, dan / ketika operandnya adalah dari jenis integral (yaitu, jenis numerik integral atau jenis char) atau jenis enum.

  • Konversi numerik eksplisit antara jenis integral atau dari float atau double 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 yang tidak konstant. 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 luapan menyebabkan kesalahan waktu kompilasi. 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#:

Lihat juga