Middle
Ի՞նչ է IDisposable ինտերֆեյսը և ինչու է այն օգտագործվում C#-ում։
sobes.tech AI
Պատասխան AI-ից
IDisposable — դա ինտերֆեյս է, որը տրամադրում է անջատվող ռեսուրսների ազատման մեխանիզմ: Այն պարունակում է մեկ մեթոդ Dispose():
Օգտագործվում է՝
- Անջատվող ռեսուրսների ազատում: Օրինակ՝ ֆայլային դեսկրիպտորներ, տվյալների բազաների կապեր, ցանցային սոկետներ:
.NET-ը չի կարող ավտոմատ կերպով կառավարել այս ռեսուրսները: - Օգտագործումից հետո մաքրման: Գаранտիա է տալիս, որ ռեսուրսային ծանր օբյեկտները ճիշտ ազատված կլինեն, նույնիսկ եթե տեղի ունենան արտառոց իրավիճակներ:
- Օգտագործման հետ
usingօպերատորով:usingօպերատորը ավտոմատ կերպով կանչում էDispose()մեթոդը կոդի բլոկի ավարտին, նույնիսկ եթե տեղի ունենան արտառոց իրավիճակներ:
Նմուշ՝ իրականացման:
public class MyResource : IDisposable
{
// Անջատվող ռեսուրսի իմիտացիա
private bool isDisposed = false;
private IntPtr unmanagedPointer;
public MyResource()
{
// Անջատվող ռեսուրսի հատկացում
unmanagedPointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
}
// `IDisposable` ինտերֆեյսի `Dispose()` մեթոդը
public void Dispose()
{
Dispose(true);
// Ֆինալիզացիայի արգելք, քանի որ ռեսուրսները արդեն ազատված են
GC.SuppressFinalize(this);
}
// Վիրտուալ մեթոդ՝ ազատման լոգիկայի համար
protected virtual void Dispose(bool disposing)
{
if (!isDisposed)
{
if (disposing)
{
// Կառավարվող ռեսուրսների ազատում, եթե կան
// ...
}
// Անջատվող ռեսուրսների ազատում
System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedPointer);
unmanagedPointer = IntPtr.Zero;
isDisposed = true;
}
}
// Ֆինալիզատոր (դեստրուկտոր), եթե `Dispose`-ը չի կանչվել
~MyResource()
{
Dispose(false);
}
}
Օգտագործման օրինակ՝ using-ով:
using (var resource = new MyResource())
{
// Ռեսուրսի հետ աշխատանք
// ...
} // `Dispose()`-ը ավտոմատ կերպով կանչվում է, երբ դուրս ենք գալիս `using` բլոկից