Middle
Kas yra IDisposable sąsaja ir kam ji naudojama C#?
sobes.tech AI
Atsakymas iš AI
IDisposable — tai interfeisas, kuris suteikia mechanizmą išlaisvinti valdomus ir nevaldomus išteklius. Jis turi vieną metodą Dispose():
Naudojamas:
- Nevaldomų išteklių išlaisvinimui: pvz., failų deskriptoriai, duomenų bazės ryšiai, tinklo lizdai.
.NETautomatiškai nevaldo šių išteklių. - Po naudojimo valymui: užtikrina, kad išteklių turintys objektai būtų tinkamai išlaisvinti, net jei įvyksta išimtys.
- Naudojant kartu su
usingoperatoriumi:usingoperatorius automatiškai iškviečiaDispose()metodą, kai baigiasi kodo blokas, net jei įvyksta išimtis. Tai yra pageidaujamas būdas naudotiIDisposableįgyvendančius objektus.
Pavyzdys:
public class MyResource : IDisposable
{
// Imituojamas nevaldomas išteklius
private bool isDisposed = false;
private IntPtr unmanagedPointer;
public MyResource()
{
// Nevaldomo ištekliaus paskyrimas
unmanagedPointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
}
// `IDisposable` metodo `Dispose()` įgyvendinimas
public void Dispose()
{
Dispose(true);
// Finalizacijos atšaukimas, nes ištekliai jau išlaisvinti
GC.SuppressFinalize(this);
}
// Vartotojo metodas, skirtas išlaisvinti išteklius
protected virtual void Dispose(bool disposing)
{
if (!isDisposed)
{
if (disposing)
{
// Valdomų išteklių išlaisvinimas, jei yra
// ...
}
// Nevaldomų išteklių išlaisvinimas
System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedPointer);
unmanagedPointer = IntPtr.Zero;
isDisposed = true;
}
}
// Finalizatorius (destruktorius), jei `Dispose` nebuvo iškviestas
~MyResource()
{
Dispose(false);
}
}
Naudojimas su using:
using (var resource = new MyResource())
{
// Darbas su ištekliu
// ...
} // `Dispose()` bus iškviestas automatiškai, išeinant iš `using` bloko