Bagikan melalui


Direktif Kompilator

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, DEBUG simbol 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. Seperti DEBUG, 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_GREATER ditentukan 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, dan NET10_OR_GREATER.
  • Simbol NETSTANDARD<x>_<y>_OR_GREATER hanya 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 TargetFramework dan 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 #nowarn atau #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