Middle
Mi az az IDisposable felület és mire használják C#-ban?
sobes.tech MI
Válasz az MI-től
IDisposable — ez egy interfész, amely egy nem kezelt erőforrás felszabadítási mechanizmust biztosít. Tartalmaz egy Dispose() metódust.
Ezt a következők céljából használják:
- Nem kezelt erőforrások felszabadítása: például fájldeskriptorok, adatbázis-kapcsolatok, hálózati socketek.
.NETnem tudja ezeket az erőforrásokat automatikusan kezelni. - Használat utáni tisztítás: biztosítja, hogy az erőforrás-igényes objektumok helyesen legyenek felszabadítva, még kivételek esetén is.
usingoperátorral való együttműködés: ausingoperátor automatikusan meghívja aDispose()metódust a kódblokk végén, még kivétel esetén is. Ez az előnyösebb módja azIDisposable-t megvalósító objektumok használatának.
Implementációs példa:
public class MyResource : IDisposable
{
// Nem kezelt erőforrás szimulációja
private bool isDisposed = false;
private IntPtr unmanagedPointer;
public MyResource()
{
// Nem kezelt erőforrás lefoglalása
unmanagedPointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
}
// `IDisposable` interfész `Dispose()` metódusa
public void Dispose()
{
Dispose(true);
// Finalizálás elnyomása, mivel az erőforrások már felszabadultak
GC.SuppressFinalize(this);
}
// Virtuális metódus a felszabadítási logika megvalósításához
protected virtual void Dispose(bool disposing)
{
if (!isDisposed)
{
if (disposing)
{
// Kezelt erőforrások felszabadítása, ha vannak
// ...
}
// Nem kezelt erőforrások felszabadítása
System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedPointer);
unmanagedPointer = IntPtr.Zero;
isDisposed = true;
}
}
// Finalizátor (destruktor), ha a `Dispose` nem lett explicit meghívva
~MyResource()
{
Dispose(false);
}
}
using-gal való használat példa:
using (var resource = new MyResource())
{
// Erőforrás használata
// ...
} // A `Dispose()` automatikusan meghívódik a `using` blokk végén