Aracılığıyla paylaş


Derleyici Yönergeleri

Bu konu, F# Etkileşimli (dotnet fsi) yönergeleri için F# ile Etkileşimli Programlama derleyici yönergelerini açıklar.

Derleyici yönergesi # simgesiyle ön eklenmiştir ve tek başına bir satırda görünür.

Aşağıdaki tabloda F# dilinde kullanılabilen derleyici yönergeleri listeleniyor.

Directive Description
#if if-ifadesi Koşullu derlemeyi destekler. #if sonrasındaki bölümdeki kod, if ifadesidefined olarak değerlendirildiğinde dahil edilir (aşağıya bakın).
#else Koşullu derlemeyi destekler. Önceki #if ile kullanılan simge defined olarak değerlendirilmezse kodun bir bölümünü içerecek şekilde işaretler.
#endif Koşullu derlemeyi destekler. Kodun koşullu bölümünün sonunu işaretler.
#[satır] int,
#[satır] intdizesi,
#[satır] intverbatim-string
Hata ayıklama için özgün kaynak kod satırını ve dosya adını gösterir. Bu özellik, F# kaynak kodu oluşturan araçlar için sağlanır.
#nowarn uyarı kodları Uyarı kodları tarafından belirtilen bir veya daha fazla derleyici uyarılarını devre dışı bırakır (aşağıya bakın).
#warnon uyarı kodları Uyarı kodları tarafından belirtilen bir veya daha fazla derleyici uyarısını etkinleştirir (aşağıya bakın).

Koşullu Derleme Yönergeleri

Bu yönergelerden biri tarafından devre dışı bırakılan kod, Visual Studio Code Düzenleyicisi'nde soluk görüntülenir.

Aşağıdaki kod , #ifve #else yönergelerinin #endifkullanımını gösterir. Bu örnekte kod, tanımının function1iki sürümünü içerir. -define derleyicisi seçeneği kullanılarak VERSION1 etkinleştirilir. Aksi takdirde ve arasındaki #else#endif kod etkinleştirilir.

#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

yönergesi #if mantıksal ifadeleri de kabul eder:

#if SILVERLIGHT || COMPILED && (NETCOREFX || !DEBUG)
#endif

Aşağıdaki ifadeler kullanılabilir.

if-expr evaluation
if-expr1 \|\| if-expr2 defined veya if-expr1if-expr2 ise defined.
if-expr1 && if-expr2 defined eğer if-expr1 ve if-expr2defined ise.
!if-expr1 defined, if-expr1defined değilse.
( if-expr1 ) if-expr1 tanımlanmışsa tanımlıdır.
symbol defined derleyici seçeneği tarafından -define tanımlandığı şekilde olarak işaretlenirse.

Mantıksal işleçler normal mantıksal önceliğe sahiptir.

F# içinde derleyici yönergesi yoktur #define . yönergesi tarafından #if kullanılan simgeleri tanımlamak için derleyici seçeneğini veya proje ayarlarını kullanmanız gerekir.

Koşullu derleme yönergeleri iç içe geçmiş olabilir. Derleyici yönergeleri için girinti önemli değildir.

Önceden tanımlanmış simgeler

F# derleyicisi ve derleme sistemi, koşullu derleme için kullanılabilecek çeşitli simgeleri otomatik olarak tanımlar.

Yapılandırma simgeleri oluşturma

Aşağıdaki simgeler derleme yapılandırmanıza göre tanımlanır:

  • DEBUG: Hata ayıklama modunda derlenirken tanımlanır. Proje sisteminde, DEBUG simge Hata Ayıklama yapılandırmasında otomatik olarak tanımlanır, ancak Yayın yapılandırmasında tanımlanmaz. Bu simge genellikle onaylar ve tanılama kodu ile kullanılır. Daha fazla bilgi için bkz. Onaylar.
  • TRACE: İzlemeyi etkinleştiren derlemeler için tanımlanır. gibi DEBUG, bu simge genellikle Hata ayıklama yapılandırmalarında tanımlanır, ancak Yayın yapılandırmalarında da etkinleştirilebilir.

Derleyici seçeneğini veya proje ayarlarını kullanarak -define bu değerleri geçersiz kılabilirsiniz.

Derleme modu simgeleri

Aşağıdaki simgeler farklı derleme modlarını birbirinden ayırır:

  • COMPILED: F# derleyicisi ile kod derlenirken tanımlanır. Bu simge, derlenmiş derlemelerde F# Etkileşimli oturumlarına göre farklı davranması için koda ihtiyacınız olduğunda kullanışlıdır.
  • INTERACTIVE: Hem etkileşimli oturumlar hem de betik yürütme dahil olmak üzere F# Etkileşimli ()dotnet fsi içinde kod derlenirken veya yürütülürken tanımlanır. Bu, etkileşimli çalışırken farklı çalışan kodlar yazmanızı sağlar.

Bu simgeleri betiklerde kullanma hakkında daha fazla bilgi için bkz. F# ile Etkileşimli Programlama.

Örnek:

#if INTERACTIVE
// Code specific to F# Interactive
#r "nuget: Newtonsoft.Json"
#endif

#if COMPILED
// Code specific to compiled assemblies
open System.Configuration
#endif

Hedef çerçeve sembolleri

Derleme sistemi, SDK stilindeki projelerde farklı hedef çerçeveler için ön işlemci sembollerini de tanımlar. Bu simgeler, birden çok .NET sürümünü hedefleyen kitaplıklar veya uygulamalar oluştururken kullanışlıdır.

Hedef Çerçeveler Semboller Ek simgeler
(.NET 5+ SDK'larda kullanılabilir)
Platform simgeleri (yalnızca mevcut olan)
işletim sistemine özgü bir TFM belirttiğinizde)
.NET Çerçevesi NETFRAMEWORK, NET481, NET48, , NET472, NET471, NET47, , NET462, NET461, NET46, NET452, NET451, NET45NET40NET35,NET20 NET48_OR_GREATER, , NET472_OR_GREATER, , NET471_OR_GREATER, NET47_OR_GREATER, NET462_OR_GREATER, , NET461_OR_GREATER, NET46_OR_GREATER, NET452_OR_GREATERNET451_OR_GREATER, NET45_OR_GREATERNET40_OR_GREATER, NET35_OR_GREATERNET20_OR_GREATER
.NET Standard NETSTANDARD, , NETSTANDARD2_1NETSTANDARD2_0, , NETSTANDARD1_6, NETSTANDARD1_5, NETSTANDARD1_4, NETSTANDARD1_3, NETSTANDARD1_2, NETSTANDARD1_1,NETSTANDARD1_0 NETSTANDARD2_1_OR_GREATER, NETSTANDARD2_0_OR_GREATER, NETSTANDARD1_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+ (ve .NET Core) NET, NET10_0, NET9_0, , NET8_0, NET7_0, NET6_0, , NET5_0, NETCOREAPP, NETCOREAPP3_1, NETCOREAPP3_0, NETCOREAPP2_2, NETCOREAPP2_1NETCOREAPP2_0NETCOREAPP1_1,NETCOREAPP1_0 NET10_0_OR_GREATER, , NET9_0_OR_GREATER, , NET8_0_OR_GREATER, NET7_0_OR_GREATER, NET6_0_OR_GREATER, , NET5_0_OR_GREATER, NETCOREAPP3_1_OR_GREATER, NETCOREAPP3_0_OR_GREATERNETCOREAPP2_2_OR_GREATER, NETCOREAPP2_1_OR_GREATERNETCOREAPP2_0_OR_GREATER, NETCOREAPP1_1_OR_GREATERNETCOREAPP1_0_OR_GREATER ANDROID, BROWSER, IOS, , MACCATALYST, MACOS, TVOS, WINDOWS,
[OS][version] (örneğin IOS15_1),
[OS][version]_OR_GREATER (örneğin IOS15_1_OR_GREATER)

Uyarı

  • Sürümsüz simgeler, hedeflediğiniz sürümden bağımsız olarak tanımlanır.
  • Sürüme özgü simgeler yalnızca hedeflediğiniz sürüm için tanımlanır.
  • Simgeler <framework>_OR_GREATER , hedeflediğiniz sürüm ve önceki tüm sürümler için tanımlanır. Örneğin, .NET Framework 2.0'ı hedef alıyorsanız, şu simgeler tanımlanır: NET20, NET20_OR_GREATER, NET11_OR_GREATERve NET10_OR_GREATER.
  • Simgeler NETSTANDARD<x>_<y>_OR_GREATER yalnızca .NET Standard hedefleri için tanımlanır, .NET Core ve .NET Framework gibi .NET Standard uygulayan hedefler için tanımlanmaz.
  • Bunlar MSBuild TargetFramework özelliği ve NuGet tarafından kullanılan hedef çerçeve adlarından (TFM' ler) farklıdır.

Örneğin, hedef çerçeveye göre koşullu olarak kod derlemek için şu simgeleri kullanabilirsiniz:

#if NET6_0_OR_GREATER
// Use .NET 6+ specific APIs
#else
// Use alternative implementation for older frameworks
#endif

NULLABLE yönergesi

F# 9'dan başlayarak, projede null atanabilir başvuru türlerini etkinleştirebilirsiniz:

<Nullable>enable</Nullable>

Bu, NULLABLE yönergesini otomatik olarak derlemeye ekler. Özelliği ilk olarak dağıtırken, çakışan kodu #if NULLABLE kare direktileri ile koşullu olarak değiştirmek yararlı olur.

#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

Satır Yönergeleri

Derleme sırasında derleyici, her hatanın oluştuğu satır numaralarına başvurarak F# kodundaki hataları bildirir. Bu satır numaraları, bir dosyadaki ilk satır için 1'de başlar. Ancak, başka bir araçtan F# kaynak kodu oluşturuyorsanız, oluşturulan F# kodundaki hatalar büyük olasılıkla başka bir kaynaktan kaynaklandığından, oluşturulan koddaki satır numaraları genellikle ilgi çekici değildir. yönergesi #line , F# kaynak kodu oluşturan araç yazarlarının özgün satır numaraları ve kaynak dosyaları hakkındaki bilgileri oluşturulan F# koduna geçirmesi için bir yol sağlar.

yönergesini kullandığınızda, dosya adlarının #line tırnak içine alınması gerekir. Dizenin önünde tamsayı belirteci (@) görüntülenmediği sürece, bunları yolda kullanmak için bir yerine iki ters eğik çizgi karakteri kullanarak ters eğik çizgi karakterlerinden kurtulmanız gerekir. Aşağıdakiler geçerli satır belirteçleridir. Bu örneklerde, özgün dosyanın Script1 bir araç üzerinden çalıştırıldığında otomatik olarak oluşturulan bir F# kod dosyasıyla sonuçlandığını ve bu yönergelerin konumundaki kodun dosyasındaki Script125. satırdaki bazı belirteçlerden oluşturulduğunu varsayalım.

# 25
#line 25
#line 25 "C:\\Projects\\MyProject\\MyProject\\Script1"
#line 25 @"C:\Projects\MyProject\MyProject\Script1"
# 25 @"C:\Projects\MyProject\MyProject\Script1"

Bu belirteçler, bu konumda oluşturulan F# kodunun içindeki veya satırındaki 25Script1bazı yapılardan türetildiğini gösterir.

Yönergelerin #line davranışını #nowarn / #warnonetkilemediğini unutmayın. Bu iki yönerge her zaman derlenen dosyayı ilişkilendirmektedir.

Uyarı Yönergeleri

Uyarı yönergeleri, kaynak dosyanın bölümleri için belirtilen derleyici uyarılarını devre dışı bırakır veya etkinleştirir.

Warn yönergesi, aşağıdakilerden oluşan tek bir kaynak kodu satırıdır:

  • İsteğe bağlı baştaki boşluk alanı
  • Dize #nowarn veya #warnon
  • Whitespace
  • Boşlukla ayrılmış bir veya daha fazla uyarı kodu (aşağıya bakın)
  • İsteğe bağlı boşluk
  • İsteğe bağlı satır açıklaması

Uyarı kodu, isteğe bağlı olarak önünde FS olan ve isteğe bağlı olarak çift tırnak içine alınmış olabilen bir basamak dizisidir (uyarı numarasını temsil eder).

Yönerge #nowarn , aynı uyarı numarası için bir #warnon yönerge bulunana kadar veya dosyanın sonuna kadar uyarıyı devre dışı bırakır. Benzer şekilde bir yönerge, #nowarn aynı uyarı numarası için bir #warnon yönerge bulunana kadar veya dosyanın sonuna kadar uyarıyı devre dışı bırakır. Bu tür çiftlerden önce ve sonra derleme varsayılanı uygulanır.

  • --nowarn derleyici seçeneği (veya ilgili msbuild özelliği) tarafından devre dışı bırakılırsa uyarı yok
  • --warnon derleyici seçeneği (veya ilgili msbuild özelliği) etkinleştirilmedikçe, isteğe bağlı uyarılar için herhangi bir uyarı yoktur.

Burada bir (eşleştirilmiş) örnek verilmiştir.

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

Ayrıca bakınız