Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Petunjuk / Saran
Baru mengembangkan perangkat lunak? Anda tidak akan segera memerlukan arahan praprosesor. Fokus pada tutorial Memulai terlebih dahulu dan kembali ke sini ketika proyek Anda memerlukan kompilasi bersyarat atau konfigurasi build.
Berpengalaman dalam bahasa lain? Jika Anda terbiasa dengan #ifdef dalam C/C++ atau kompilasi bersyarat dalam bahasa lain, arahan praprosesor C# berfungsi sama. Langsung ke sintaksis yang Anda butuhkan.
Direktif pra-prosesor C# memberi tahu pengkompilasi kode apa yang akan disertakan, dikecualikan, atau diperlakukan secara berbeda saat membuat aplikasi Anda. Panduan ini dapat mengubah program yang dihasilkan. Arahan praprosesor selalu dimulai dengan # dan harus muncul di barisnya sendiri (mengabaikan spasi di awal). Anda dapat menambahkan komentar berikutnya setelah direktif. Sementara dokumen referensi bahasa mencakup semua direktif yang tersedia, tiga kelompok mencakup penggunaan sehari-hari:
-
Aplikasi berbasis file (
#:) - konfigurasikan aplikasi berbasis file. -
Kompilasi kondisional (
#if/#elif/#else/#endif) — sertakan atau kecualikan kode berdasarkan konfigurasi build atau kerangka kerja target. -
Penekanan peringatan (
#pragma warning) — menekan atau memulihkan peringatan kompilator tertentu.
Arahan aplikasi berbasis file
Dimulai dengan C# 14, aplikasi berbasis file menggunakan dua arahan tambahan:
-
#!— baris shebang yang memungkinkan eksekusi file langsung di Unix (misalnya,./Program.cs). Ini mengharuskan izin eksekusi ditetapkan pada berkas (chmod +x <file>). -
#:— arahan sistem build yang mengonfigurasi paket, pengaturan SDK, dan opsi lain untuk program file tunggal.
Gunakan #:package untuk menambahkan paket NuGet. Misalnya, aplikasi berbasis file berikut menggunakan Spectre.Console paket untuk merender output bergaya:
#!/usr/bin/env dotnet
#:package Spectre.Console@*
AnsiConsole.MarkupLine("[bold green]Hello[/] from a file-based app!");
Anda dapat menentukan versi yang tepat dengan @, atau menggunakan @* untuk menarik versi terbaru. Tambahkan beberapa #:package direktif untuk menyertakan lebih banyak paket:
#:package Serilog@3.1.1
Direktif lain #: memungkinkan Anda mereferensikan proyek, mengatur properti MSBuild, atau mengubah SDK:
#:project ../SharedLibrary/SharedLibrary.csproj
#:property PublishAot=false
#:sdk Microsoft.NET.Sdk.Web
Untuk daftar lengkap direktif, lihat Aplikasi berbasis file dan referensi bahasa.
Kompilasi kondisional
Gunakan #if, #elif, #else, dan #endif untuk menyertakan atau mengecualikan kode berdasarkan apakah simbol ditentukan. Simbol yang paling umum adalah DEBUG (diatur secara otomatis untuk build Debug) dan simbol kerangka kerja target seperti NET10_0_OR_GREATER:
static void ConfigureLogging()
{
#if DEBUG
Console.WriteLine("Debug logging enabled — verbose output active.");
#else
Console.WriteLine("Release logging — errors only.");
#endif
}
Sistem build mendefinisikan simbol DEBUG ketika Anda melakukan build dalam konfigurasi Debug. Anda tidak perlu mendefinisikannya sendiri. Simbol kerangka kerja target seperti NET10_0_OR_GREATER dan NET8_0_OR_GREATER memungkinkan Anda menulis kode yang beradaptasi dengan versi .NET yang berbeda dalam proyek multi-penargetan.
Anda dapat menggabungkan simbol dengan operator logis: && (dan), || (atau), dan ! (tidak):
static void ShowPlatformInfo()
{
#if NET10_0_OR_GREATER
Console.WriteLine("Running on .NET 10 or later.");
#elif NET8_0_OR_GREATER
Console.WriteLine("Running on .NET 8 or 9.");
#else
Console.WriteLine("Running on an older .NET version.");
#endif
}
Gunakan #define di bagian atas file untuk menentukan simbol Anda sendiri. Anda juga dapat menentukan simbol untuk seluruh proyek dengan menggunakan DefineConstants properti dalam file proyek Anda.
Penyembunyian peringatan
Gunakan #pragma warning disable untuk menekan peringatan pengompilasi tertentu, dan #pragma warning restore untuk mengaktifkannya kembali. Selalu batasi supresi dengan cakupan sesempit mungkin.
static void ProcessData()
{
try
{
// Some operation that might fail
var data = File.ReadAllText("config.json");
Console.WriteLine($"Config loaded: {data.Length} characters");
}
#pragma warning disable CS0168 // Variable is declared but never used
catch (FileNotFoundException ex)
#pragma warning restore CS0168
{
// Fall back to defaults — the exception details aren't needed here
Console.WriteLine("Config file not found, using defaults.");
}
}
Petunjuk / Saran
Selalu tentukan nomor peringatan, seperti CS0168, daripada menonaktifkan semua peringatan. Pendekatan ini membuat penindasan tetap ditargetkan dan memperjelas mengapa peringatan ditekan.