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.
Topik ini menjelaskan arahan kompilator, untuk arahan F# Interactive (dotnet fsi), lihat Pemrograman Interaktif dengan F#.
Direktif kompilator diawali dengan simbol # dan muncul pada garis dengan sendirinya.
Tabel berikut mencantumkan arahan kompilator yang tersedia di F#.
| Directive | Description |
|---|---|
#if
if-expression |
Mendukung kompilasi bersyarat. Kode di bagian setelah #if disertakan jika ekspresi-if bernilai defined (lihat di bawah). |
#else |
Mendukung kompilasi bersyarat. Menandai bagian kode untuk disertakan jika simbol yang digunakan dengan #if sebelumnya tidak dievaluasi menjadi defined. |
#endif |
Mendukung kompilasi bersyarat. Menandai akhir bagian kode bersyarat. |
#[baris] int,#[baris] string int,#[baris] intverbatim-string |
Menunjukkan baris kode sumber asli dan nama file, untuk debugging. Fitur ini disediakan untuk alat yang menghasilkan kode sumber F#. |
#nowarn
kode peringatan |
Menonaktifkan satu atau beberapa peringatan kompilator seperti yang ditentukan oleh kode peringatan (lihat di bawah). |
#warnon
kode peringatan |
Mengaktifkan satu atau beberapa peringatan kompilator seperti yang ditentukan oleh kode peringatan (lihat di bawah). |
Pengarah Kompilasi Bersyarat
Kode yang dinonaktifkan oleh salah satu pengarah ini tampak redup di Visual Studio Code Editor.
Kode berikut mengilustrasikan penggunaan pengarah #if, #else, dan #endif. Dalam contoh ini, kode berisi dua versi definisi function1. Ketika VERSION1 didefinisikan dengan menggunakan -tetapkan opsi kompilator, kode antara pengarah #if dan pengarah #else diaktifkan. Jika tidak, kode antara #else dan #endif diaktifkan.
#if VERSION1
let function1 x y =
printfn "x: %d y: %d" x y
x + 2 * y
#else
let function1 x y =
printfn "x: %d y: %d" x y
x - 2*y
#endif
let result = function1 10 20
Direktif #if juga menerima ekspresi logis:
#if SILVERLIGHT || COMPILED && (NETCOREFX || !DEBUG)
#endif
Ekspresi berikut dapat digunakan.
| if-expr | evaluasi |
|---|---|
if-expr1 \|\| if-expr2 |
defined jika if-expr1 atau if-expr2 adalah defined. |
if-expr1 && if-expr2 |
defined jika if-expr1 dan if-expr2 adalah defined. |
!if-expr1 |
defined jika if-expr1 bukan defined. |
( if-expr1 ) |
ditentukan jika if-expr1 didefinisikan. |
symbol |
defined jika ditandai sebagaimana didefinisikan oleh -define opsi pengkompilasi. |
Operator logis memiliki prioritas logis yang biasa.
Tidak ada #define direktif kompilator di F#. Anda harus menggunakan opsi kompilator atau setelan proyek untuk menentukan simbol yang digunakan oleh pengarah #if.
Pengarah kompilasi bersyarat dapat dikumpulkan. Indentasi tidak signifikan untuk arahan kompilator.
Simbol yang telah ditentukan sebelumnya
Sistem kompilator dan build F# secara otomatis menentukan beberapa simbol yang dapat digunakan untuk kompilasi bersyarah.
Membangun simbol konfigurasi
Simbol berikut didefinisikan berdasarkan konfigurasi build Anda:
-
DEBUG: Ditentukan saat mengkompilasi dalam mode Debug. Dalam sistem proyek,DEBUGsimbol secara otomatis ditentukan dalam konfigurasi Debug, tetapi tidak dalam konfigurasi Rilis. Simbol ini umumnya digunakan dengan pernyataan dan kode diagnostik. Untuk informasi selengkapnya, lihat Pernyataan. -
TRACE: Didefinisikan untuk build yang mengaktifkan pelacakan. SepertiDEBUG, simbol ini biasanya didefinisikan dalam konfigurasi Debug tetapi juga dapat diaktifkan dalam konfigurasi Rilis.
Anda dapat mengambil alih nilai-nilai ini -define menggunakan opsi pengkompilasi atau pengaturan proyek.
Simbol mode kompilasi
Simbol berikut membedakan antara mode kompilasi yang berbeda:
-
COMPILED: Didefinisikan saat mengkompilasi kode dengan pengkompilasi F#. Simbol ini berguna ketika Anda memerlukan kode untuk berperilaku berbeda dalam rakitan yang dikompilasi versus sesi Interaktif F#. -
INTERACTIVE: Didefinisikan saat mengkompilasi atau menjalankan kode di F# Interactive (dotnet fsi), termasuk sesi interaktif dan eksekusi skrip. Ini memungkinkan Anda menulis kode yang berfungsi secara berbeda saat berjalan secara interaktif.
Untuk informasi selengkapnya tentang menggunakan simbol ini dalam skrip, lihat Pemrograman Interaktif dengan F#.
Contoh:
#if INTERACTIVE
// Code specific to F# Interactive
#r "nuget: Newtonsoft.Json"
#endif
#if COMPILED
// Code specific to compiled assemblies
open System.Configuration
#endif
Simbol kerangka kerja target
Sistem build juga mendefinisikan simbol pra-prosesor untuk kerangka kerja target yang berbeda dalam proyek gaya SDK. Simbol-simbol ini berguna saat membuat pustaka atau aplikasi yang menargetkan beberapa versi .NET.
| Kerangka Kerja Target | Simbol | Simbol tambahan (tersedia dalam .NET 5+ SDK) |
Simbol-simbol platform (tersedia hanya saat Anda menentukan TFM khusus OS) |
|---|---|---|---|
| .NET Framework |
NETFRAMEWORK, , NET481, NET48NET472, NET471, NET47, NET462, NET461, NET46, NET452, NET451, NET45, , NET40, NET35NET20 |
NET48_OR_GREATER, , NET472_OR_GREATERNET471_OR_GREATER, NET47_OR_GREATER, NET462_OR_GREATER, NET461_OR_GREATER, NET46_OR_GREATER, NET452_OR_GREATER, NET451_OR_GREATER, NET45_OR_GREATER, , NET40_OR_GREATER, , NET35_OR_GREATERNET20_OR_GREATER |
|
| .NET Standar | , NETSTANDARD, NETSTANDARD2_1, NETSTANDARD2_0, NETSTANDARD1_6, NETSTANDARD1_5, NETSTANDARD1_4, NETSTANDARD1_3, NETSTANDARD1_2, NETSTANDARD1_1, NETSTANDARD1_0 |
NETSTANDARD2_1_OR_GREATER, NETSTANDARD2_0_OR_GREATERNETSTANDARD1_6_OR_GREATER, NETSTANDARD1_5_OR_GREATER, NETSTANDARD1_4_OR_GREATER, NETSTANDARD1_3_OR_GREATER, NETSTANDARD1_2_OR_GREATER, NETSTANDARD1_1_OR_GREATER, NETSTANDARD1_0_OR_GREATER |
|
| .NET 5+ (dan .NET Core) |
NET, , NET10_0, NET9_0NET8_0, NET7_0, NET6_0, NET5_0, NETCOREAPP, NETCOREAPP3_1, NETCOREAPP3_0, NETCOREAPP2_2, NETCOREAPP2_1, , NETCOREAPP2_0, NETCOREAPP1_1NETCOREAPP1_0 |
NET10_0_OR_GREATER, , NET9_0_OR_GREATERNET8_0_OR_GREATER, NET7_0_OR_GREATER, NET6_0_OR_GREATER, NET5_0_OR_GREATER, NETCOREAPP3_1_OR_GREATER, NETCOREAPP3_0_OR_GREATER, NETCOREAPP2_2_OR_GREATER, NETCOREAPP2_1_OR_GREATER, , NETCOREAPP2_0_OR_GREATER, , NETCOREAPP1_1_OR_GREATERNETCOREAPP1_0_OR_GREATER |
ANDROID, BROWSER, IOS, MACCATALYST, MACOS, TVOS, WINDOWS[OS][version] (misalnya IOS15_1),[OS][version]_OR_GREATER (misalnya IOS15_1_OR_GREATER) |
Nota
- Simbol tanpa versi didefinisikan tanpa memperhatikan versi yang Anda targetkan.
- Simbol khusus versi hanya ditentukan untuk versi yang Anda targetkan.
- Simbol
<framework>_OR_GREATERditentukan untuk versi yang Anda targetkan dan semua versi sebelumnya. Misalnya, jika Anda menargetkan .NET Framework 2.0, simbol berikut ditentukan:NET20,NET20_OR_GREATER,NET11_OR_GREATER, danNET10_OR_GREATER. - Simbol
NETSTANDARD<x>_<y>_OR_GREATERhanya didefinisikan untuk target .NET Standard, dan bukan untuk target yang mengimplementasikan .NET Standard, seperti .NET Core dan .NET Framework. - Ini berbeda dari moniker kerangka kerja target (TFM) yang digunakan dalam properti MSBuild
TargetFrameworkdan NuGet.
Misalnya, Anda dapat menggunakan simbol-simbol ini untuk mengkompilasi kode secara kondisional berdasarkan kerangka kerja target:
#if NET6_0_OR_GREATER
// Use .NET 6+ specific APIs
#else
// Use alternative implementation for older frameworks
#endif
Direktif Nullable
Dimulai dengan F# 9, Anda dapat mengaktifkan jenis referensi yang dapat bernilai null dalam proyek:
<Nullable>enable</Nullable>
Ini secara otomatis mengatur arahan NULLABLE ke build. Ini berguna saat pertama kali meluncurkan fitur, untuk mengubah kode yang bertentangan dengan kondisi tertentu menggunakan arahan hash #if NULLABLE.
#if NULLABLE
let length (arg: 'T when 'T: not null) =
Seq.length arg
#else
let length arg =
match arg with
| null -> -1
| s -> Seq.length s
#endif
Arahan Garis
Saat membangun, kompilator melaporkan kesalahan dalam kode F# dengan merujuk nomor baris di mana setiap kesalahan terjadi. Nomor baris ini dimulai dari 1 untuk baris pertama dalam file. Namun, jika Anda membuat kode sumber F# dari alat lain, nomor baris dalam kode yang dihasilkan umumnya tidak menarik, karena kesalahan dalam kode F# yang dihasilkan kemungkinan besar muncul dari sumber lain. Pengarah #line menyediakan cara bagi pembuat alat yang menghasilkan kode sumber F# untuk meneruskan informasi tentang nomor baris asli dan file sumber ke kode F# yang dihasilkan.
Saat Anda menggunakan pengarah #line, nama file harus diapit tanda kutip. Kecuali jika token verbatim (@) muncul di depan string, Anda harus menghindari karakter garis miring terbalik dengan menggunakan dua karakter garis miring terbalik alih-alih satu karakter untuk menggunakannya di jalur. Berikut ini adalah token baris yang valid. Dalam contoh ini, asumsikan bahwa file asli Script1 menghasilkan file kode F# yang dibuat secara otomatis saat dijalankan melalui alat, dan bahwa kode di lokasi pengarah ini dihasilkan dari beberapa token pada baris 25 dalam file Script1.
# 25
#line 25
#line 25 "C:\\Projects\\MyProject\\MyProject\\Script1"
#line 25 @"C:\Projects\MyProject\MyProject\Script1"
# 25 @"C:\Projects\MyProject\MyProject\Script1"
Token ini menunjukkan bahwa kode F# yang dihasilkan di lokasi ini berasal dari beberapa konstruksi pada atau dekat garis 25 in Script1.
Perhatikan bahwa #line arahan tidak memengaruhi perilaku#nowarn / #warnon . Kedua arahan ini selalu menghubungkan file yang sedang dikompilasi.
Peringatkan Direktif
Direktif peringatan menonaktifkan atau mengaktifkan peringatan kompilator tertentu untuk bagian tertentu dari file sumber.
Direktif peringatan adalah satu baris kode sumber yang terdiri dari
- Spasi kosong utama opsional
- String
#nowarnatau#warnon - Whitespace
- Satu atau beberapa kode peringatan (lihat di bawah), dipisahkan oleh spasi kosong
- Spasi kosong opsional
- Komentar baris opsional
Kode peringatan adalah urutan digit (mewakili nomor peringatan), secara opsional didahului oleh FS, secara opsional dikelilingi oleh tanda kutip ganda.
Direktif #nowarn menonaktifkan peringatan hingga ditemukan direktif #warnon untuk nomor peringatan yang sama, atau hingga akhir file. Demikian pula, direktif #nowarn menonaktifkan peringatan sampai direktif #warnon untuk nomor peringatan yang sama ditemukan, atau sampai akhir file. Sebelum dan sesudah pasangan tersebut, default kompilasi berlaku, yaitu
- tidak ada peringatan jika dinonaktifkan oleh opsi kompilator --nowarn (atau properti msbuild masing-masing)
- tidak ada peringatan untuk peringatan keikutsertaan, kecuali diaktifkan oleh opsi pengompilasi --warnon (atau properti MSBuild masing-masing)
Berikut adalah contoh (buatan).
module A
match None with None -> () // warning
let x =
#nowarn 25
match None with None -> 1 // no warning
#warnon FS25
match None with None -> () // warning
#nowarn "FS25" FS007 "42"
match None with None -> () // no warning
Lihat juga
- Referensi Bahasa F#
- Opsi Pengkompilasi