Aracılığıyla paylaş


Null Değerler

Bu konuda, F# dilinde null değerin nasıl kullanıldığı açıklanmaktadır.

F# 9'dan Önceki Null Değerler

Null değer normalde F# dilinde değerler veya değişkenler için kullanılmaz. Ancak null, bazı durumlarda anormal bir değer olarak görünür. Bir tür F# dilinde tanımlanmışsa, türe allowNullLiteral özniteliği uygulanmadığı sürece null değerin normal bir değer olarak olmasına izin verilmez. Bir tür başka bir .NET dilinde tanımlanmışsa, null olası bir değerdir ve bu türlerle birlikte çalışırken F# kodunuz null değerlerle karşılaşabilir.

F# ile tanımlanmış ve yalnızca F# dilinden kullanılan bir tür için, doğrudan F# kitaplığını kullanarak null bir değer oluşturmanın tek yolu Unchecked.defaultof veya Array.zeroCreatekullanmaktır. Ancak, diğer .NET dillerinden kullanılan bir F# türü için veya bu türü F# dilinde yazılmayan bir API ile kullanıyorsanız (.NET Framework gibi) null değerler oluşabilir.

Başka bir .NET dilinde olası bir null değere sahip başvuru değişkeni kullanabileceğiniz durumlarda, F# dilindeki option türünü kullanabilirsiniz. Null yerine, F# option türüyle, nesne yoksa None seçenek değerini kullanırsınız. Bir nesne olduğunda, Some(obj) seçenek değerini obj nesnesi ile kullanırsınız. Daha fazla bilgi için bkz. Seçenekler. nulliçin Some xxolduğunda, null değerini bir Option olarak yine de paketleyebilirsiniz. Bu nedenle, bir değer Noneolduğunda null kullanmanız önemlidir.

null anahtar sözcüğü F# dilinde geçerli bir anahtar sözcüktür ve .NET Framework API'leri veya başka bir .NET dilinde yazılmış diğer API'lerle çalışırken bunu kullanmanız gerekir. Null değere ihtiyaç duyabileceğiniz iki durum, bir .NET API'sini çağırıp bağımsız değişken olarak null değer geçirdiğinizde ve bir .NET yöntem çağrısından dönüş değerini veya çıkış parametresini yorumladığınızda olur.

Bir .NET yöntemine null değer geçirmek için çağıran kodda null anahtar sözcüğünü kullanmanız gerekir. Aşağıdaki kod örneği bunu göstermektedir.

open System

// Pass a null value to a .NET method.
let ParseDateTime (str: string) =
    let (success, res) =
        DateTime.TryParse(str, null, System.Globalization.DateTimeStyles.AssumeUniversal)

    if success then Some(res) else None

Bir .NET yönteminden alınan null değeri yorumlamak için, varsa desen eşleştirmeyi kullanın. Aşağıdaki kod örneği, bir giriş akışının sonunu okumaya çalıştığında ReadLine tarafından döndürülen null değeri anlamak için desen eşleştirmenin nasıl kullanılabileceğini gösterir.

// Open a file and create a stream reader.
let fileStream1 =
    try
        System.IO.File.OpenRead("TextFile1.txt")
    with :? System.IO.FileNotFoundException ->
        printfn "Error: TextFile1.txt not found."
        exit (1)

let streamReader = new System.IO.StreamReader(fileStream1)

// ProcessNextLine returns false when there is no more input;
// it returns true when there is more input.
let ProcessNextLine nextLine =
    match nextLine with
    | null -> false
    | inputString ->
        match ParseDateTime inputString with
        | Some(date) -> printfn "%s" (date.ToLocalTime().ToString())
        | None -> printfn "Failed to parse the input."

        true

// A null value returned from .NET method ReadLine when there is
// no more input.
while ProcessNextLine(streamReader.ReadLine()) do
    ()

F# türleri için null değerler, Array.zeroCreate'ı kullanarak Unchecked.defaultof'i çağırdığınızda olduğu gibi başka şekillerde de oluşturulabilir. Null değerleri kapsüllenmiş tutmak için bu tür kodlara dikkat etmeniz gerekir. Yalnızca F# için tasarlanan bir kitaplıkta, her işlevde null değerleri denetlemeniz gerekmez. Diğer .NET dilleriyle birlikte çalışmak üzere bir kitaplık yazıyorsanız, aynı C# veya Visual Basic kodunda yaptığınız gibi null giriş parametreleri için denetimler eklemeniz ve bir ArgumentNullExceptionoluşturmanız gerekebilir.

Rastgele bir değerin null olup olmadığını denetlemek için aşağıdaki kodu kullanabilirsiniz.

match box value with
| null -> printf "The value is null."
| _ -> printf "The value is not null."

F# 9 ile başlayan Null Değerler

F# 9'da, null değeri alabilen başvuru türleriyle başa çıkmak için dile ekstra özellikler eklenir. Bunlar varsayılan olarak kapalıdır; bunları açmak için proje dosyanıza aşağıdaki özelliğin koyulması gerekir:

<Nullable>enable</Nullable>

Bu, --checknulls+bayrağı F# derleyicisine geçirir ve derleme için bir NULLABLEönişlemci yönergesi ayarlar.

Null yapılabilirliğini açıkça kabul etmek için, bir tür bildiriminin yeni söz dizimiyle sonlandırılması gerekir.

type | null

Çubuk simgesi |, söz diziminde mantıksal VEYA (OR) anlamına sahiptir ve iki ayrık tür kümesinin birleşimini oluşturur: altyapı türü ve null değer atanabilen başvuru. Bu, F# ayrımcı birleşiminin birden çok örneğini bildirmek için kullanılan aynı el dizimsel simgedir: type AB = A | BAveya Banlamını taşır.

Null atanabilir ek açıklama | null, bir referans türünün normalde kullanılacağı her yerde kullanılabilir.

  • Birleşim türlerinin, kayıt türlerinin ve özel türlerin alanları.
  • Var olan türlerin diğer adlarını yazın.
  • Genel türde uygulamalar yazın.
  • Bağlamalara, parametrelere veya dönüş türlerine izin vermek için açık tür ek açıklamaları.
  • Üyeler, özellikler veya alanlar gibi nesne programlama yapılarına ek açıklamalar yazın.
type AB = A | B
type AbNull = AB | null

type RecordField = { X: string | null }
type TupleField = string * string | null

type NestedGenerics = { Z : List<List<string | null> | null> | null }

Çubuk simgesi |, F# dilinde başka kullanımlara da sahiptir ve bu da dilbilgisel belirsizliklere yol açabilir. Böyle durumlarda, null-anotasyonlu türün etrafında parantez gereklidir.

// Unexpected symbol '|' (directly before 'null') in member definition
type DUField = N of string | null

( )'lı parantezlerden bir çiftin içine aynı türü sararak sorunu giderir.

type DUField = N of (string | null)

Desen eşleştirmede kullanıldığında, farklı desen eşleştirme yan tümcelerini ayırmak için | kullanılır.

match x with
| ?: string | null -> ...

Bu kod parçacığı aslında koda eşdeğerdir, önce string türüne karşı bir tür testi yapar ve ardından null işlemek için ayrı bir yan tümceye sahip olur:

match x with
| ?: string 
| null -> ...

Önemli

Birlikte çalışabilirlik amacıyla dile null ile ilgili ek özellikler eklendi. F# türü modellemesinde | null kullanılması eksik bilgileri ifade etmede idiomatic olarak kabul edilmez. Bu amaçla, seçenekleri kullanın (yukarıda açıklandığı gibi). Stil kılavuzunda null ile ilgili kuralları hakkında daha fazla bilgi edinin.

Ayrıca bkz.