IDisposable dan Pernyataan using
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C# di Coddy. Pelajaran 45 dari 70.
Beberapa object menyimpan resource yang tidak dapat dibersihkan secara otomatis oleh pengumpul sampah, seperti file handle, koneksi database, dan socket jaringan. Interface IDisposable menyediakan cara standar untuk melepaskan resource ini setelah kamu selesai menggunakannya.
Sebuah class mengimplementasikan IDisposable dengan menyediakan method Dispose():
public class FileHandler : IDisposable
{
private bool disposed = false;
public void Dispose()
{
if (!disposed)
{
Console.WriteLine("Releasing resources...");
disposed = true;
}
}
}Kamu bisa memanggil Dispose() secara manual, tetapi bagaimana jika terjadi pengecualian sebelum kamu mencapai baris itu? Pernyataan using menjamin pembersihan tetap dilakukan, bahkan saat terjadi masalah:
using (FileHandler handler = new FileHandler())
{
// Gunakan handler
} // Dispose() dipanggil secara otomatis di siniC# modern menawarkan sintaks yang lebih rapi dengan deklarasi using, yang membuang object saat keluar dari cakupan:
void ProcessFile()
{
using FileHandler handler = new FileHandler();
// Gunakan handler
} // Dispose() dipanggil saat method selesaiPernyataan using berfungsi dengan tipe apa pun yang mengimplementasikan IDisposable. class bawaan seperti StreamReader, SqlConnection, dan HttpClient semuanya mengimplementasikan interface ini, sehingga pengelolaan resource yang tepat menjadi mudah dan andal.
Tantangan
MudahMari kita buat simulator koneksi database yang menunjukkan pengelolaan resource yang tepat menggunakan interface IDisposable dan pernyataan using. Kamu akan membuat class yang mencatat kapan koneksi dibuka dan ditutup, sehingga resource selalu dilepaskan dengan benar.
Kamu akan menyusun kodemu dalam dua file:
DatabaseConnection.cs: Buat classDatabaseConnectiondi namespaceDataAccessyang mengimplementasikanIDisposable. Koneksimu harus:- Memiliki property
ConnectionName(string, hanya-baca) yang ditetapkan melalui constructor - Melacak apakah koneksi sudah dibuang menggunakan field boolean privat
- Mencetak
Connection opened: {ConnectionName}saat object dibuat (di constructor) - Mengimplementasikan method
Dispose()untuk mencetakConnection closed: {ConnectionName}, tetapi hanya jika koneksi belum dibuang (mencegah pembuangan ganda) - Memiliki method
Query(string sql)yang mengembalikanExecuting on {ConnectionName}: {sql}
- Memiliki property
Program.cs: Di file utama, tunjukkan pengelolaan resource yang tepat dengan menggunakan pernyataanusingbersama koneksi database-mu. Buat koneksi, jalankan query, dan biarkan blokusingmenangani pembersihan secara otomatis.
Kamu akan menerima dua input:
- Nama koneksi (misalnya,
MainDB) - Query SQL yang akan dijalankan (misalnya,
SELECT * FROM Users)
Gunakan pernyataan using untuk membuat koneksimu. Di dalam blok, panggil method Query dan cetak hasilnya. Saat blok using berakhir, Dispose() akan dipanggil secara otomatis.
Misalnya, jika inputnya adalah MainDB dan SELECT * FROM Users, output-nya akan seperti berikut:
Connection opened: MainDB
Executing on MainDB: SELECT * FROM Users
Connection closed: MainDBPerhatikan bahwa koneksi ditutup secara otomatis saat blok using berakhir, jadi kamu tidak perlu mengingat untuk memanggil Dispose() secara manual. Pola ini memastikan resource selalu dibersihkan, bahkan jika terjadi exception di dalam blok!
Coba sendiri
using System;
using DataAccess;
class Program
{
public static void Main(string[] args)
{
string connectionName = Console.ReadLine();
string sqlQuery = Console.ReadLine();
// TODO: Gunakan pernyataan 'using' untuk membuat DatabaseConnection
// Di dalam blok using:
// 1. Panggil method Query dengan sqlQuery
// 2. Cetak hasil dari method Query
// Method Dispose akan dipanggil secara otomatis saat blok using berakhir
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalNamespace & DirektifPengantar class & objectKata Kunci 'this'Method dan ParameterField vs PropertyKonstruktorInisialisasi objectRingkasan: Kalkulator Sederhana4Pewarisan
Sintaks Dasar Pewarisan (:)Kata Kunci 'base'Kata Kunci Virtual & OverrideClass SealedBase Class 'object'Rangkuman: Hierarki Karyawan7Fitur Lanjutan
Overloading OperatorIndexer (this[])Penimpaan ToString()Extension methodRingkasan: Custom list2Property & Anggota Statis
Property yang Diimplementasikan OtomatisProperty Hanya Baca dan Hanya TulisField dan method StatisClass StatisAnggota Berbentuk Ekspresi5Polimorfisme & Antarmuka
Polimorfisme saat kompilasi vs runtimeAntarmuka vs kelas abstrakBeberapa antarmukaAntarmuka eksplisitUpcasting & DowncastingRingkasan, Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi daripada PewarisanGenerics (class dan method)Delegate dan EventAtribut dan ReflectionIDisposable dan Pernyataan usingDasar-Dasar Dependency Injection11Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola CompositeLatihan sendiri: Compiler C# online