Bagikan melalui


Manajemen Sumber Daya: Gunakan Kata Kunci

Topik ini menjelaskan kata kunci use dan using fungsi, yang dapat mengontrol inisialisasi dan rilis sumber daya.

Sumber Daya

Istilah sumber daya digunakan dengan lebih dari satu cara. Ya, sumber daya dapat menjadi data yang digunakan aplikasi, seperti string, grafik, dan seperangkatnya, tetapi dalam konteks ini, sumber daya mengacu pada sumber daya perangkat lunak atau sistem operasi, seperti konteks perangkat grafis, handel file, koneksi jaringan dan database, objek konkurensi seperti handel tunggu, dan sebagainya. Penggunaan sumber daya ini oleh aplikasi melibatkan akuisisi sumber daya dari sistem operasi atau penyedia sumber daya lainnya, diikuti oleh rilis sumber daya yang kemudian ke kumpulan sehingga dapat diberikan ke aplikasi lain. Masalah terjadi ketika aplikasi tidak merilis sumber daya kembali ke kumpulan umum.

Pengelolaan Sumber Daya

Untuk mengelola sumber daya secara efisien dan bertanggung jawab dalam aplikasi, Anda harus segera merilis sumber daya dan dengan cara yang dapat diprediksi. .NET Framework membantu Anda melakukan ini dengan menyediakan System.IDisposable antarmuka. Jenis yang menerapkan System.IDisposable memiliki System.IDisposable.Dispose metode , yang membebaskan sumber daya dengan benar. Jaminan aplikasi yang ditulis dengan baik yang System.IDisposable.Dispose dipanggil segera ketika objek apa pun yang menyimpan sumber daya terbatas tidak lagi diperlukan. Untungnya, sebagian besar bahasa .NET memberikan dukungan untuk mempermudah ini, dan F# tidak terkecuali. Ada dua konstruksi bahasa yang berguna yang mendukung pola pembuangan: use pengikatan dan using fungsi.

gunakan Pengikatan

Kata use kunci memiliki formulir yang menyerupan let pengikatan:

gunakanekspresinilai =

Ini menyediakan fungsionalitas yang sama dengan let pengikatan tetapi menambahkan panggilan ke Dispose pada nilai ketika nilai keluar dari cakupan. Perhatikan bahwa pengkompilasi menyisipkan pemeriksaan null pada nilai, sehingga jika nilainya adalah null, panggilan ke Dispose tidak dicoba.

Contoh berikut menunjukkan cara menutup file secara otomatis dengan menggunakan use kata kunci.

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."

Beberapa instans dibuang dalam urutan terbalik tempat instans use dideklarasikan. Artinya, yang pertama use akan menjadi yang terakhir dirilis.

Nota

Anda dapat menggunakan use dalam ekspresi komputasi, dalam hal ini versi ekspresi yang use dikustomisasi digunakan. Untuk informasi selengkapnya, lihat Urutan, Ekspresi asinkron, Ekspresi tugas, dan Ekspresi Komputasi.

menggunakan Fungsi

Fungsi using ini memiliki formulir berikut:

using (ekspresi1) function-or-lambda

using Dalam ekspresi, ekspresi1 membuat objek yang harus dibuang. Hasil ekspresi1 (objek yang harus dibuang) menjadi argumen, nilai, ke function-or-lambda, yang merupakan fungsi yang mengharapkan satu argumen yang tersisa dari jenis yang cocok dengan nilai yang dihasilkan oleh ekspresi1, atau ekspresi lambda yang mengharapkan argumen dari jenis tersebut. Pada akhir eksekusi fungsi, runtime memanggil Dispose dan membebaskan sumber daya (kecuali nilainya adalah null, dalam hal ini panggilan ke Dispose tidak dicoba).

Contoh berikut menunjukkan using ekspresi dengan ekspresi lambda.

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."

Contoh berikutnya memperlihatkan using ekspresi dengan fungsi.

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

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

Perhatikan bahwa fungsi bisa menjadi fungsi yang sudah memiliki beberapa argumen yang diterapkan. Contoh kode berikut menunjukkan hal ini. Ini membuat file yang berisi string XYZ.

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

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

Fungsi using dan pengikatan use adalah cara yang hampir setara untuk mencapai hal yang sama. Kata using kunci memberikan kontrol lebih besar atas kapan Dispose dipanggil. Saat Anda menggunakan using, Dispose dipanggil di akhir fungsi atau ekspresi lambda; saat Anda menggunakan use kata kunci, Dispose dipanggil di akhir blok kode yang berisi. Secara umum, Anda harus lebih suka menggunakan use alih-alih using fungsi.

Lihat juga