Manajemen Sumber Daya: Gunakan Kata Kunci

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

Sumber

Istilah sumber daya digunakan dengan lebih dari satu cara. Ya, sumber daya dapat menjadi data yang digunakan aplikasi, seperti string, grafik, dan sejenisnya, 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 oleh aplikasi melibatkan perolehan sumber daya dari sistem operasi atau penyedia sumber daya lainnya, diikuti oleh rilis sumber daya selanjutnya 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 dalam aplikasi secara efisien dan bertanggung jawab, Anda harus melepaskan sumber daya dengan segera dan dengan cara yang dapat diprediksi. .NET Framework membantu Anda melakukan ini dengan menyediakan antarmuka System.IDisposable. Jenis yang mengimplementasikan System.IDisposable memiliki metode System.IDisposable.Dispose, yang merilis sumber daya dengan benar. Aplikasi yang ditulis dengan baik menjamin bahwa 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 tidak terkecuali F#. Ada dua konstruksi bahasa yang berguna yang mendukung pola pembuangan: pengikatan use dan fungsi using.

gunakan Pengikatan

Kata kunci use dilengkapi formulir yang menyerupai pengikatan let:

gunakan ekspresi = nilai

Ini menyediakan fungsionalitas yang sama dengan let pengikatan tetapi menambahkan panggilan ke Dispose pada nilai ketika nilai keluar dari cakupan. Perhatikan bahwa kompilator 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 kata kunci 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."

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

Catatan

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

menggunakan Fungsi

Fungsi using ini memiliki sifat-sifat berikut:

using (expression1) function-or-lambda

Dalam ekspresi using, ekspresi1 membuat objek yang harus dibuang. Hasil expression1 (objek yang harus dibuang) menjadi argumen, nilai, ke function-or-lambda, yang merupakan fungsi yang mengharapkan argumen yang tersisa tunggal dari jenis yang cocok dengan nilai yang dihasilkan oleh ekspresion1, 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 Buang tidak dicoba).

Contoh berikut menunjukkan ekspresi using 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 ekspresi using 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 menerapkan beberapa argumen. 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 kunci using memberikan kontrol lebih besar atas kapan Dispose akan dipanggil. Saat Anda menggunakan using, Dispose dipanggil di akhir fungsi atau ekspresi lambda; ketika Anda menggunakan kata kunci use, Dispose dipanggil di akhir blok kode yang berisi. Secara umum, Anda harus lebih suka menggunakan use alih-alih fungsi using.

Lihat juga