Kaynak Yönetimi: use Anahtar Sözcüğü

Bu konu başlığında, kaynakların başlatılmasını ve yayımlanmasını using denetleyebilen anahtar sözcüğü use ve işlevi açıklanmaktadır.

Kaynaklar

Kaynak terimi birden çok şekilde kullanılır. Evet, kaynaklar bir uygulamanın kullandığı dizeler, grafikler ve benzeri veriler olabilir, ancak bu bağlamda kaynaklar grafik cihaz bağlamları, dosya tanıtıcıları, ağ ve veritabanı bağlantıları, bekleme tutamaçları gibi eşzamanlılık nesneleri gibi yazılım veya işletim sistemi kaynaklarını ifade eder. Bu kaynakların uygulamalar tarafından kullanılması, kaynağın işletim sisteminden veya başka bir kaynak sağlayıcısından alınmasını ve ardından kaynağın daha sonra başka bir uygulamaya sağlanabilmesi için havuza yayımlanmasını içerir. Uygulamalar kaynakları ortak havuza geri bırakmadığında sorunlar oluşur.

Kaynakları Yönetme

Bir uygulamadaki kaynakları verimli ve sorumlu bir şekilde yönetmek için kaynakları hemen ve öngörülebilir bir şekilde serbest bırakmanız gerekir. .NET Framework, arabirimini sağlayarak bunu yapmanıza System.IDisposable yardımcı olur. Uygulayan System.IDisposable bir tür, kaynakları doğru bir şekilde serbest getiren yöntemine sahiptir System.IDisposable.Dispose . İyi yazılmış uygulamalar, System.IDisposable.Dispose sınırlı bir kaynağı barındıran herhangi bir nesneye artık ihtiyaç duyulmadığında hemen çağrıldığını garanti eder. Neyse ki, çoğu .NET dili bunu kolaylaştırmak için destek sağlar ve F# özel durum değildir. Dispose desenini destekleyen iki yararlı dil yapısı vardır: use bağlama ve using işlev.

bağlamayı kullanma

anahtar sözcüğü, use bağlamaya benzer bir biçime let sahiptir:

use value = ifadesi

Bağlamayla aynı işlevi let sağlar, ancak değer kapsam dışına çıktığında değerine bir çağrı Dispose ekler. Derleyicinin değere null bir denetim eklediğini, böylece değer ise nullçağrısının Dispose denenmediğini unutmayın.

Aşağıdaki örnekte, anahtar sözcüğünü kullanarak bir dosyanın otomatik olarak nasıl kapatılmaya devam ettiği gösterilmektedir use .

open System.IO

let writetofile filename obj =
   use file1 = File.CreateText(filename)
   file1.WriteLine("{0}", obj.ToString() )
   // file1.Dispose() is called implicitly here.

writetofile "abc.txt" "Humpty Dumpty sat on a wall."

Birden çok örneği use , bildirildiği ters sırada atılır. Yani, ilki use en son çıkan olacak.

Not

Hesaplama ifadelerinde kullanabilirsiniz use ve bu durumda ifadenin use özelleştirilmiş bir sürümü kullanılır. Daha fazla bilgi için bkz . Sıralar, Zaman Uyumsuz ifadeler, Görev ifadeleri ve Hesaplama İfadeleri.

using function

using İşlev aşağıdaki forma sahiptir:

using (expression1) function-or-lambda

İfadede using , ifade1 atılması gereken nesneyi oluşturur. İfade1'in sonucu (atılması gereken nesne), ifade1 tarafından üretilen değerle eşleşen bir türün kalan tek bağımsız değişkenini bekleyen bir işlev veya bu tür bir bağımsız değişken bekleyen bir lambda ifadesi olan function-or-lambda için bir bağımsız değişken, değer olur. İşlevin yürütülmesinin sonunda, çalışma zamanı kaynakları çağırır Dispose ve serbest bırakılır (değer olmadığı nullsürece, Dispose çağrısı denenmemiştir).

Aşağıdaki örnekte bir lambda ifadesi ile ifade gösterilmektedir using .

open System.IO

let writetofile2 filename obj =
    using (System.IO.File.CreateText(filename)) ( fun file1 ->
        file1.WriteLine("{0}", obj.ToString() )
    )

writetofile2 "abc2.txt" "The quick sly fox jumps over the lazy brown dog."

Sonraki örnekte işlevi olan using ifade gösterilir.

let printToFile (file1 : System.IO.StreamWriter) =
    file1.WriteLine("Test output");

using (System.IO.File.CreateText("test.txt")) printToFile

İşlevin, bazı bağımsız değişkenlerin zaten uygulanmış olduğu bir işlev olabileceğini unutmayın. Aşağıdaki kod örneği bunu gösterir. dizesini XYZiçeren bir dosya oluşturur.

let printToFile2 obj (file1 : System.IO.StreamWriter) =
    file1.WriteLine(obj.ToString())

using (System.IO.File.CreateText("test.txt")) (printToFile2 "XYZ")

using İşlev ve bağlama, use aynı şeyi başarmanın neredeyse eşdeğer yollarıdır. anahtar using sözcüğü çağrıldığında Dispose daha fazla denetim sağlar. kullandığınızda usingDispose işlevin veya lambda ifadesinin sonunda çağrılır; anahtar sözcüğünü use kullandığınızda, Dispose içeren kod bloğunun sonunda çağrılır. Genel olarak işlevi yerine using kullanmayı use tercih etmelisiniz.

Ayrıca bkz.