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ığı null
sü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 XYZ
iç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 using
Dispose
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.