Middle
Mis on IDisposable liides ja milleks seda C#-s kasutatakse?
sobes.tech AI
Vastus AI-lt
IDisposable — see liides pakub mehhanismi haldamata ressursside vabastamiseks. See sisaldab ühte meetodit Dispose():
Kasutatakse:
- Haldamata ressursside vabastamiseks: näiteks failide deskriptorid, andmebaasi ühendused, võrgusoketid.
.NETei halda neid ressursse automaatselt. - Pärast kasutamist puhastamiseks: tagab, et ressursimahukad objektid vabastatakse korrektselt, isegi kui tekib erandid.
- Koos
usingoperaatoriga:usingoperaator kutsub automaatselt väljaDispose()meetodi, kui koodiplokk lõpeb, isegi kui tekib erand. See on soovitatav viisIDisposable-i realiseerivate objektide kasutamiseks.
Näide realiseerimisest:
public class MyResource : IDisposable
{
// Imiteerib haldamata ressurssi
private bool isDisposed = false;
private IntPtr unmanagedPointer;
public MyResource()
{
// Haldamata ressursi eraldamine
unmanagedPointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
}
// `IDisposable` liidese `Dispose()` meetod
public void Dispose()
{
Dispose(true);
// Finaliseerimise vältimine, kuna ressursid on juba vabastatud
GC.SuppressFinalize(this);
}
// Virtuaalne meetod ressursside vabastamiseks
protected virtual void Dispose(bool disposing)
{
if (!isDisposed)
{
if (disposing)
{
// Hallatavate ressursside vabastamine, kui on
// ...
}
// Haldamata ressursside vabastamine
System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedPointer);
unmanagedPointer = IntPtr.Zero;
isDisposed = true;
}
}
// Finaliseerija (destruktor), kui `Dispose` ei ole otseselt kutsutud
~MyResource()
{
Dispose(false);
}
}
Näide kasutamisest using-iga:
using (var resource = new MyResource())
{
// Ressursiga töötamine
// ...
} // `Dispose()` kutsutakse automaatselt välja, kui väljutakse `using`-ist