Di properti Solusi, saya memiliki Konfigurasi yang diatur ke "rilis" untuk satu-satunya proyek saya.
Pada awal rutin utama, saya memiliki kode ini, dan itu menunjukkan "Mode = Debug". Saya juga memiliki dua baris ini di bagian paling atas:
#define DEBUG
#define RELEASE
Apakah saya menguji variabel yang benar?
#if (DEBUG)
Console.WriteLine("Mode=Debug");
#elif (RELEASE)
Console.WriteLine("Mode=Release");
#endif
Tujuan saya adalah untuk menetapkan standar yang berbeda untuk variabel berdasarkan mode debug vs rilis.
c#
debugging
release
compiler-directives
NealWalters
sumber
sumber
Jawaban:
DEBUG
Saya_DEBUG
harus sudah didefinisikan dalam VS.Hapus
#define DEBUG
kode Anda. Atur preprocessor dalam konfigurasi build untuk build spesifik itu.Alasannya mencetak "Mode = Debug" adalah karena Anda
#define
dan kemudian melewatkanelif
.Cara yang benar untuk memeriksa adalah:
Jangan periksa
RELEASE
.sumber
#if
dan tidak#ifdef
?#ifdef
khusus untuk preprosesor C / C ++, C # mengamanatkan penggunaan#if
.Secara default, Visual Studio mendefinisikan DEBUG jika proyek dikompilasi dalam mode Debug dan tidak mendefinisikannya jika itu dalam mode rilis. RELEASE tidak didefinisikan dalam mode Rilis secara default. Gunakan sesuatu seperti ini:
Jika Anda ingin melakukan sesuatu hanya dalam mode rilis:
Juga, ada baiknya menunjukkan bahwa Anda dapat menggunakan
[Conditional("DEBUG")]
atribut pada metode yang mengembalikannyavoid
hanya dieksekusi jika simbol tertentu didefinisikan. Kompiler akan menghapus semua panggilan ke metode tersebut jika simbol tidak didefinisikan:sumber
Saya lebih suka memeriksanya seperti ini daripada mencari
#define
arahan:Dengan peringatan itu tentu saja Anda bisa mengkompilasi dan menggunakan sesuatu dalam mode debug tetapi masih belum memiliki debugger terpasang.
sumber
#IF DEBUG
dalam situasi kode debugging yang seharusnya tidak bertahan lama. Untuk kode produksi, saya setuju dengan penggunaan di atas.#DEBUG
adalah bahwa pernyataan if ini ada dalam kode Anda dan selalu diperiksa ketika#DEBUG
jawabannya menghapus kode yang tidak berlaku pada waktu kompilasi sehingga Anda tidak memiliki pemeriksaan run-time dan Anda. exe (atau apa pun yang Anda kompilasi) lebih kecil.Saya bukan penggemar besar dari hal-hal #jika, terutama jika Anda menyebar di seluruh basis kode Anda karena akan memberi Anda masalah di mana Debug membangun pass tetapi rilis build gagal jika Anda tidak hati-hati.
Jadi inilah yang saya buat (terinspirasi oleh #ifdef di C # ):
sumber
DebuggingService
bukan kelas statis dan mengapa Anda memerlukan antarmuka? Apakah ini ada hubungannya dengan menggunakan ini dengan wadah IOC?Metode ini
Debug.Assert
memiliki atribut bersyaratDEBUG
. Jika tidak didefinisikan, panggilan dan tugasisDebug = true
yang dihilangkan :Jika
DEBUG
didefinisikan,isDebug
diatur ketrue
(dan diteruskan keDebug.Assert
, yang tidak melakukan apa pun dalam kasus itu).sumber
var iterations = 10; Debug.Assert((iterations = Int32.MaxValue) > 0);
Jika Anda mencoba menggunakan variabel yang ditentukan untuk tipe build Anda harus menghapus dua baris ...
... ini akan menyebabkan #jika (DEBUG) selalu benar.
Juga tidak ada simbol kompilasi bersyarat standar untuk RELEASE . Jika Anda ingin mendefinisikan satu pergi ke properti proyek, klik pada tab Build dan kemudian tambahkan RELEASE ke kotak teks simbol kompilasi simbol bersyarat di bawah judul Umum .
Pilihan lain adalah melakukan ini ...
sumber
Hapus definisi Anda di atas
sumber
Versi sedikit dimodifikasi (bastardized?) Dari jawaban oleh Tod Thomson sebagai fungsi statis daripada kelas yang terpisah (saya ingin dapat menyebutnya dalam tampilan WebForm dari kelas viewutils yang sudah saya sertakan).
sumber
Pastikan untuk mendefinisikan konstanta DEBUG dalam Properti Membangun Proyek. Ini akan mengaktifkan
#if DEBUG
. Saya tidak melihat konstan RELEASE yang telah ditentukan sebelumnya, sehingga dapat menyiratkan bahwa apa pun yang Tidak ada dalam blok DEBUG adalah mode RELEASE.sumber
NameSpace
metode
sumber
Kiat yang mungkin menghemat banyak waktu - jangan lupa meskipun Anda memilihnya
debug
bawah konfigurasi build (pada menu vs2012 / 13 itu ada di bawah BUILD => CONFIGURATION MANAGER) - itu tidak cukup.Anda perlu memperhatikan PUBLISH
Configuration
, karena:sumber
Karena tujuan arahan COMPILER ini adalah untuk memberi tahu kompiler untuk TIDAK menyertakan kode, kode debug, kode beta, atau mungkin kode yang diperlukan oleh semua pengguna akhir Anda, kecuali katakanlah pada departemen periklanan, yaitu #Define AdDept yang ingin Anda dapat menyertakan atau menghapusnya berdasarkan kebutuhan Anda. Tanpa harus mengubah kode sumber Anda jika misalnya non AdDept bergabung ke dalam AdDept. Maka semua yang perlu dilakukan adalah memasukkan direktif #AdDept di halaman properti opsi kompiler dari versi program yang ada dan melakukan kompilasi dan wa la! kode program yang digabungkan muncul secara hidup !.
Anda mungkin juga ingin menggunakan deklaratif untuk proses baru yang tidak siap untuk prime time atau yang tidak dapat aktif dalam kode sampai saatnya untuk melepaskannya.
Bagaimanapun, itulah cara saya melakukannya.
sumber
Saya harus memikirkan cara yang lebih baik. Saya sadar bahwa #jika blok adalah komentar yang efektif dalam konfigurasi lain (dengan asumsi
DEBUG
atauRELEASE
; tetapi benar dengan simbol apa pun)sumber
Hapus definisi dan periksa apakah kondisinya pada mode debug. Anda tidak perlu memeriksa apakah arahan dalam mode rilis.
Sesuatu seperti ini:
sumber