Penegasan dalam Kode Terkelola

Pernyataan, atau pernyataan Assert, menguji kondisi, yang Anda tetapkan sebagai argumen untuk pernyataan Assert. Jika kondisi bernilai benar, tidak ada tindakan yang terjadi. Jika kondisi bernilai salah, pernyataan gagal. Jika Anda menjalankan dengan build debug, program Anda akan memasuki mode putus.

Dalam topik ini

Pernyataan di Namespace Layanan System.Diagnostics

Metode Debug.Assert

Efek samping Debug.Assert

Persyaratan Pelacakan dan Debug

Menyatakan argumen

Menyesuaikan perilaku Assert

Mengatur penegasan dalam file konfigurasi

Pernyataan di Namespace Layanan System.Diagnostics

Di Visual Basic dan Visual C#, Anda dapat menggunakan metode Assert dari Debug atau Trace, yang ada di namespace layanan System.Diagnostics. Debug metode kelas tidak disertakan dalam versi Rilis program Anda, sehingga tidak meningkatkan ukuran atau mengurangi kecepatan kode rilis Anda.

C++ tidak mendukung Debug metode kelas. Anda dapat mencapai efek yang sama dengan menggunakan kelas Trace dengan kompilasi kondisional, seperti #ifdef DEBUG... #endif.

Dalam topik ini

Metode Debug.Assert

Gunakan metode System.Diagnostics.Debug.Assert secara bebas untuk menguji kondisi yang seharusnya berlaku jika kode Anda benar. Misalnya, Anda telah menulis fungsi pembagian bilangan bulat. Menurut aturan matematika, pembagi tidak pernah bisa menjadi nol. Anda dapat menguji hal ini dengan menggunakan penegasan:

int IntegerDivide ( int dividend , int divisor )
{
    Debug.Assert ( divisor != 0 );
    return ( dividend / divisor );
}

Ketika Anda menjalankan kode ini di bawah debugger, penegasan pernyataan dievaluasi, tetapi dalam versi Rilis, perbandingan tidak dibuat, sehingga tidak ada overhead tambahan.

Berikut adalah contoh lain. Anda memiliki kelas yang menerapkan akun pemeriksaan, sebagai berikut:

float balance = savingsAccount.Balance;
Debug.Assert ( amount <= balance );
savingsAccount.Withdraw ( amount );

Sebelum menarik uang dari akun, Anda ingin memastikan bahwa saldo akun cukup untuk menutupi jumlah yang Anda siapkan untuk ditarik. Anda dapat menulis penegasan untuk memeriksa saldo:

float balance = savingsAccount.Balance;
Trace.Assert ( amount <= balance );
savingsAccount.Withdraw ( amount );

Perhatikan bahwa panggilan ke metode System.Diagnostics.Debug.Assert menghilang saat Anda membuat versi Rilis kode Anda. Hal tersebut berarti bahwa panggilan yang memeriksa saldo menghilang dalam versi Rilis. Untuk mengatasi masalah ini, Anda harus mengganti System.Diagnostics.Debug.Assert dengan System.Diagnostics.Trace.Assert, yang tidak hilang dalam versi Rilis:

Panggilan ke System.Diagnostics.Trace.Assert menambahkan overhead ke versi Rilis Anda, tidak seperti panggilan ke System.Diagnostics.Debug.Assert.

Dalam topik ini

Efek samping Debug.Assert

Saat Anda menggunakan System.Diagnostics.Debug.Assert, pastikan bahwa kode apa pun di dalamnya Assert tidak mengubah hasil program jika Assert dihapus. Jika tidak, Anda mungkin secara tidak sengaja menimbulkan bug yang hanya muncul di versi Rilis program Anda. Sangat berhati-hatilah dengan penegasan yang berisi panggilan fungsi atau prosedur, seperti contoh berikut:

// unsafe code
Debug.Assert (meas(i) != 0 );

Penggunaan System.Diagnostics.Debug.Assert ini mungkin tampak aman pada pandangan pertama, tetapi misalkan meas fungsi memperbarui penghitung setiap kali dipanggil. Saat Anda membuat versi Rilis, panggilan ke meas ini dihilangkan, sehingga penghitung tidak diperbarui. Ini adalah contoh fungsi dengan efek samping. Menghilangkan panggilan ke fungsi yang memiliki efek samping dapat mengakibatkan bug yang hanya muncul di versi Rilis. Untuk menghindari masalah tersebut, jangan melakukan panggilan fungsi dalam System.Diagnostics.Debug.Assert pernyataan. Gunakan variabel sementara sebagai gantinya:

temp = meas( i );
Debug.Assert ( temp != 0 );

Bahkan saat Anda menggunakan System.Diagnostics.Trace.Assert, Anda mungkin masih ingin menghindari melakukan panggilan fungsi di dalam pernyataan Assert. Panggilan tersebut harus aman, karena System.Diagnostics.Trace.Assert pernyataan tidak dihilangkan dalam build Rilis. Namun, jika Anda menghindari konstruksi seperti itu sebagai masalah kebiasaan, Anda cenderung tidak membuat kesalahan ketika Anda menggunakan System.Diagnostics.Debug.Assert.

Dalam topik ini

Persyaratan Pelacakan dan Debug

Jika Anda membuat proyek menggunakan wizard Visual Studio, simbol TRACE ditentukan secara default dalam konfigurasi Rilis dan Debug. Simbol DEBUG ditentukan secara default hanya dalam build Debug.

Jika tidak, agar metode Trace berfungsi, program Anda harus memiliki salah dari hal berikut ini di bagian atas file sumber:

  • #Const TRACE = True dalam Visual Basic

  • #define TRACE dalam Visual C# dan C++

    Atau program Anda harus dibangun dengan opsi TRACE:

  • /d:TRACE=True dalam Visual Basic

  • /d:TRACE dalam Visual C# dan C++

    Jika Anda perlu menggunakan metode Debug dalam build C# atau Rilis Visual Basic, Anda harus menentukan simbol DEBUG dalam konfigurasi Rilis Anda.

    C++ tidak mendukung Debug metode kelas. Anda dapat mencapai efek yang sama dengan menggunakan kelas Trace dengan kompilasi kondisional, seperti #ifdef DEBUG... #endif. Anda dapat menentukan simbol ini dalam kotak dialog Halaman Properti <Proyek>. Untuk informasi selengkapnya, lihat Mengubah Pengaturan Proyek untuk Konfigurasi Debug Visual Basic atau Mengubah Pengaturan Proyek untuk Konfigurasi Debug C atau C++.

Menyatakan argumen

System.Diagnostics.Trace.Assert dan System.Diagnostics.Debug.Assert memerlukan hingga tiga argumen. Argumen pertama, dan yang wajib, adalah kondisi yang ingin Anda periksa. Jika Anda memanggil System.Diagnostics.Trace.Assert(Boolean) atau System.Diagnostics.Debug.Assert(Boolean) hanya dengan satu argumen, metode Assert memeriksa kondisi dan, jika hasilnya salah, menghasilkan konten tumpukan panggilan ke jendela Output. Contoh berikut menunjukkan System.Diagnostics.Trace.Assert(Boolean) dan System.Diagnostics.Debug.Assert(Boolean):

Debug.Assert ( stacksize > 0 );
Trace.Assert ( stacksize > 0 );

Argumen kedua dan ketiga, jika ada, harus berupa string. Jika Anda memanggil System.Diagnostics.Trace.Assert atau System.Diagnostics.Debug.Assert dengan dua atau tiga argumen, argumen pertama merupakan sebuah kondisi. Metode memeriksa kondisi dan, jika hasilnya salah, menghasilkan string kedua dan string ketiga. Contoh berikut menunjukkan System.Diagnostics.Debug.Assert(Boolean, String) dan System.Diagnostics.Trace.Assert(Boolean, String) digunakan dengan dua argumen:

Debug.Assert ( stacksize > 0, "Out of stack space" );
Trace.Assert ( stacksize > 0, "Out of stack space" );

Contoh berikut menunjukkan System.Diagnostics.Debug.Assert(Boolean, String, String) dan System.Diagnostics.Trace.Assert(Boolean, String, String) digunakan dengan tiga argumen:

Debug.Assert ( stacksize > 100, "Out of stack space" , "Failed in inctemp" );
Trace.Assert ( stacksize > 0, "Out of stack space", "Failed in inctemp" );

Dalam topik ini

Menyesuaikan perilaku Penegasan

Jika Anda menjalankan aplikasi dalam mode antarmuka pengguna, Assert metode menampilkan kotak dialog Pernyataan Gagal saat kondisi gagal. Tindakan yang terjadi saat pernyataan gagal dikendalikan oleh properti Listeners atau Listeners.

Anda dapat menyesuaikan perilaku output dengan menambahkan objek TraceListener ke koleksi Listeners, dengan menghapus TraceListener dari koleksi Listeners, atau dengan mengesampingkan metode System.Diagnostics.TraceListener.Fail dari TraceListener yang ada untuk membuatnya berperilaku berbeda.

Misalnya, Anda dapat mengambil alih metode System.Diagnostics.TraceListener.Fail untuk menulis ke log peristiwa alih-alih menampilkan kotak dialog Pernyataan Gagal.

Untuk menyesuaikan output dengan cara ini, program Anda harus berisi pendengar, dan Anda harus mewarisi dari TraceListener dan mengambil alih metode System.Diagnostics.TraceListener.Fail miliknya.

Untuk informasi selengkapnya, lihat Pendengar Pelacakan.

Dalam topik ini

Mengatur penegasan dalam file konfigurasi

Anda dapat mengatur penegasan dalam file konfigurasi program serta dalam kode Anda. Untuk mengetahui informasi selengkapnya, lihat System.Diagnostics.Trace.Assert atau System.Diagnostics.Debug.Assert.