Akankah #jika RELEASE bekerja seperti #jika DEBUG tidak dalam C #?

277

Dalam semua contoh yang pernah saya lihat dari direktif compiler #if, mereka menggunakan "DEBUG". Bisakah saya menggunakan "RELEASE" dengan cara yang sama untuk mengecualikan kode yang saya tidak ingin jalankan ketika dikompilasi dalam mode debug? Kode yang ingin saya kelilingi dengan blok ini mengirimkan banyak email, dan saya tidak ingin secara tidak sengaja mengirimkannya saat pengujian.

Brian Sullivan
sumber
3
#if !DEBUGmelayani fungsi yang sama seperti #if RELEASEseharusnya. Atau, #if DEBUGmaka #elsemaka #endifjika ada kode yang berbeda untuk menjalankan dalam mode.
Nat

Jawaban:

275

Tidak, itu tidak akan terjadi, kecuali jika Anda melakukan pekerjaan.

Bagian penting di sini adalah apa sebenarnya DEBUG, dan itu adalah semacam konstanta yang didefinisikan yang dapat diperiksa oleh kompiler.

Jika Anda memeriksa properti proyek, di bawah tab Build, Anda akan menemukan tiga hal:

  • Kotak teks berlabel "Simbol kompilasi bersyarat"
  • Kotak centang berlabel "Tetapkan DEBUG konstan"
  • Kotak centang berlabel "Tetapkan TRACE konstan"

Tidak ada kotak centang seperti itu, atau konstanta / simbol yang sudah ditentukan sebelumnya yang memiliki nama RELEASE.

Namun, Anda dapat dengan mudah menambahkan nama itu ke kotak teks berlabel Simbol kompilasi bersyarat, tetapi pastikan Anda mengatur konfigurasi proyek ke mode Rilis sebelum melakukannya, karena pengaturan ini adalah per konfigurasi.

Jadi pada dasarnya, kecuali Anda menambahkannya ke kotak teks, #if RELEASEtidak akan menghasilkan kode apa pun di bawah konfigurasi apa pun.

Lasse V. Karlsen
sumber
393

RELEASE tidak ditentukan, tetapi Anda dapat menggunakan

#if (!DEBUG)
  ...
#endif
M4N
sumber
2
Bukan, tapi tentu saja Anda dapat menggunakan operator BUKAN seperti itu. Tidak memikirkan itu ketika saya menulis jawaban saya.
Lasse V. Karlsen
4
Memang, tetapi menggunakan solusi Anda lebih jelas dan "lebih benar", IMHO.
Daniel Schaffer
1
Terutama karena Anda dapat memiliki lebih banyak konfigurasi daripada sekadar RELEASE dan DEBUG - untuk beberapa proyek saya ada DEBUG, RELEASE, dan DEPLOY atau DEV (DEBUG), TEST, dan PROD (RELEASE)
Adam Nofsinger
Bagi orang lain yang bingung dengan komentar di atas, jawaban yang tidak diedit bertanya-tanya apakah RELEASEsudah didefinisikan.
Dan
41

Nggak.

Sementara dalam konfigurasi debug ada DEBUGkonstanta yang didefinisikan (secara otomatis ditentukan oleh Visual Studio) sementara tidak ada konstanta yang ditentukan untuk mode rilis. Periksa pengaturan proyek Anda dalam pengembangan.

Memilih [Tetapkan DEBUG konstan] di bawah Project -> Build seperti memasukkan #define DEBUG di awal setiap file.

Jika Anda ingin menetapkan konstanta RELEASE untuk konfigurasi rilis, buka:

  • Properti Proyek -> Bangun
  • Pilih Mode Rilis
  • di kotak teks simbol kompilasi simbol masukkan: RELEASE
Pop Catalin
sumber
1
Menemukan ini sangat berguna karena saya sekarang telah menetapkan konstanta RELEASE untuk konfigurasi Rilis saya dan konstanta PENGUJIAN untuk konfigurasi Pengujian saya. Sangat berguna untuk mendefinisikan memerlukan https hanya untuk rilis#if (RELEASE) [RequireHttps] #endif
tekiegirl
27

Pada instalasi VS saya (VS 2008) #if RELEASEtidak bekerja. Namun Anda bisa menggunakannya#if !DEBUG

Contoh:

#if !DEBUG
SendTediousEmail()
#endif
JaredPar
sumber
10

Saya belum pernah melihat itu sebelumnya ... tetapi saya telah melihat:

#if (DEBUG == FALSE)

dan

#if (!DEBUG)

Itu berhasil untukmu?

Pete H.
sumber
Simbol preprosesor tidak memiliki nilai dalam C #; mereka hanya "didefinisikan" atau "tidak didefinisikan". Jadi hanya !operator yang akan bekerja, seperti pada contoh kedua Anda.
Jonathon Reinhart
1
Menurut MSDN, Anda dapat menggunakan operator seperti == untuk menguji benar atau salah. msdn.microsoft.com/en-us/library/4y6tbswk.aspx
jason_ruz
8

Anda dapat menggunakan #if(!DEBUG)untuk tujuan ini.

Abdus Salam Azad
sumber
Hemat yang bagus untuk saya adalah ingin menggunakan ini di xamrian, terima kasih telah memposting.
rogue39nin
4

"Pop Catalin" benar. Mengontrol definisi berdasarkan jenis bangunan memberikan banyak fleksibilitas. Misalnya, Anda dapat memiliki konfigurasi "DEBUG", "DEMO", dan "RELEASE" semua dalam solusi yang sama. Itu mencegah perlunya duplikasi pemrograman dengan dua solusi berbeda.

Jadi ya #if RELEASEatau #if (RELEASE)berfungsi sama seperti #if DEBUGketika simbol kompilasi kondisional RELEASE didefinisikan.

Berikut ini diambil dari posting "Pop Catalin": Jika Anda ingin mendefinisikan konstanta RELEASE untuk konfigurasi rilis, masuk ke: * Project Properties -> Build * Pilih Release Mode * di kotak teks simbol kompilasi simbol masukkan: RELEASE


sumber
2

Saya tahu ini adalah pertanyaan lama, tetapi mungkin perlu disebutkan bahwa Anda dapat membuat konfigurasi sendiri di luar DEBUG dan RELEASE, seperti TEST atau UAT.

Jika kemudian pada tab Build dari halaman properti proyek Anda kemudian mengatur "simbol kompilasi bersyarat" ke TEST (misalnya) Anda kemudian dapat menggunakan konstruk seperti

#if (DEBUG || TEST )
    //Code that will not be executed in RELEASE or UAT
#endif

Anda dapat menggunakan konstruk ini untuk alasan tertentu seperti klien yang berbeda jika Anda memiliki kebutuhan, atau bahkan seluruh Metode Web misalnya. Kami juga telah menggunakan ini di masa lalu di mana beberapa perintah menyebabkan masalah pada perangkat keras tertentu, jadi kami memiliki konfigurasi untuk sebuah aplikasi ketika digunakan untuk perangkat keras X.

Fetchez la vache
sumber
0

Anda dapat membuat sendiri simbol waktu kompilasi bersyarat (nama apa pun yang Anda suka). Buka "dialog Bangun proyek", yang terletak di kotak properti proyek, opsi menu: Proyek -> [nama proyek] Properti ...

Anda juga dapat mendefinisikannya "di bagian atas file kode C #". Suka:

#define RELEASE
// or
#undef RELEASE

Anda dapat menggunakan simbol dalam pernyataan #jika:

#if RELEASE
// code ...
#elif 
// code ...
#endif

// or

#if !RELEASE
// code ...
#endif
Raja Kopi
sumber
-8

kenapa tidak adil?

#if RELEASE
#undef DEBUG
#endif
Matt Davison
sumber
3
Tidak ada konstanta bernama RELEASE yang ditentukan oleh Visual Studio dalam mode rilis.
Pop Catalin
1
/d:RELEASEjuga akan bekerja. Anda juga bisa menambahkan ini ke simbol kompilasi bersyarat di bawah konfigurasi Release (tab build properti proyek).
SliverNinja - MSFT