Yönetilmeyen Kaynakları TemizlemeCleaning Up Unmanaged Resources

Uygulamanızın oluşturduğu nesnelerin çoğu için güvenebilirsiniz. NET'in çöp toplayıcısı bellek yönetimini halledecek.For the majority of the objects that your app creates, you can rely on .NET's garbage collector to handle memory management. Ancak, yönetilmeyen kaynaklar içeren nesneler oluşturduğunuzda, uygulamanızda kullanmayı bitirdiğinizde, bu kaynakları açıkça serbest bırakmanız gerekir.However, when you create objects that include unmanaged resources, you must explicitly release those resources when you finish using them in your app. En sık karşılaşılan yönetilmeyen kaynak türleri, dosyalar, pencereler, ağ bağlantıları veya veritabanı bağlantıları gibi işletim sistemi kaynaklarını saran nesnelerdir.The most common types of unmanaged resource are objects that wrap operating system resources, such as files, windows, network connections, or database connections. Çöp toplayıcı yönetilmeyen bir kaynağı kapsülleyen bir nesnenin kullanım ömrünü izleyebilir olsa da, yönetilmeyen kaynağı nasıl serbest bırakacağını ve temizleyeceğini bilmez.Although the garbage collector is able to track the lifetime of an object that encapsulates an unmanaged resource, it doesn't know how to release and clean up the unmanaged resource.

Türleriniz yönetilmeyen kaynaklar ise, aşağıdakileri yapmanız gerekir:If your types use unmanaged resources, you should do the following:

  • Bertaraf deseniuygulayın.Implement the dispose pattern. Bu, yönetilmeyen IDisposable.Dispose kaynakların deterministik serbest bırakılmasını etkinleştirmek için bir uygulama sağlamanızı gerektirir.This requires that you provide an IDisposable.Dispose implementation to enable the deterministic release of unmanaged resources. Nesne (ve kullandığı Dispose kaynaklar) artık ihtiyaç duyulmadığında, türün bir tüketicisi çağırır.A consumer of your type calls Dispose when the object (and the resources it uses) is no longer needed. Yöntem, Dispose yönetilmeyen kaynakları hemen serbest bırakır.The Dispose method immediately releases the unmanaged resources.

  • Türünüzdeki bir tüketicinin aramayı Disposeunutması durumunda, yönetilmeyen kaynaklarınızın serbest bırakılmasını sağlayın.Provide for your unmanaged resources to be released in the event that a consumer of your type forgets to call Dispose. Bunu yapmak için iki yol vardır:There are two ways to do this:

    • Yönetilmeyen kaynağınızı sarmak için güvenli bir tanıtıcı kullanın.Use a safe handle to wrap your unmanaged resource. Önerilen yöntem budur.This is the recommended technique. Güvenli tutamaçları System.Runtime.InteropServices.SafeHandle sınıftan türetilmiştir Finalize ve sağlam bir yöntem içerir.Safe handles are derived from the System.Runtime.InteropServices.SafeHandle class and include a robust Finalize method. Güvenli bir tutamaç kullandığınızda, IDisposable arabirimi uygulamanız yeterlidir Dispose ve uygulamanızda güvenli iş talının yöntemini ararsınız. IDisposable.DisposeWhen you use a safe handle, you simply implement the IDisposable interface and call your safe handle's Dispose method in your IDisposable.Dispose implementation. Emniyet kolunun sonlandırıcısı, Dispose yöntemi çağrılmazsa çöp toplayıcıtarafından otomatik olarak çağrılır.The safe handle's finalizer is called automatically by the garbage collector if its Dispose method is not called.

      —veya——or—

    • Object.Finalize Yöntemi geçersiz kılın.Override the Object.Finalize method. Sonlandırma, bir tür tüketici nin bunları deterministically elden çıkarmak için IDisposable.Dispose aramak için başarısız olduğunda yönetilmeyen kaynakların nonterministic serbest sağlar.Finalization enables the non-deterministic release of unmanaged resources when the consumer of a type fails to call IDisposable.Dispose to dispose of them deterministically. Ancak, nesne sonlandırma karmaşık ve hataya açık bir işlem olduğundan, kendi sonlandırıcınızı sağlamak yerine güvenli tanıtıcı kullanmanız önerilir.However, because object finalization can be a complex and error-prone operation, we recommend that you use a safe handle instead of providing your own finalizer.

Daha sonra türünün tüketicileri, uygulamanızı IDisposable.Dispose doğrudan yönetilmeyen kaynaklar tarafından kullanılan boş belleğe çağırabilir.Consumers of your type can then call your IDisposable.Dispose implementation directly to free memory used by unmanaged resources. Bir yöntemi düzgün Dispose bir şekilde uyguladığınızda, Finalize güvenli iştünüzün yöntemi Object.Finalize veya yöntemin kendi geçersiz kılma yöntemi, Dispose yöntemin çağrılması durumunda kaynakları temizlemek için bir koruma haline gelir.When you properly implement a Dispose method, either your safe handle's Finalize method or your own override of the Object.Finalize method becomes a safeguard to clean up resources in the event that the Dispose method is not called.

Bu BölümdeIn This Section

Elden Çıkarma Yönteminin Uygulanması Yönetilmeyen kaynakları serbest bırakmak için elden çıkarma deseni nasıl uygulanacağını açıklar.Implementing a Dispose Method Describes how to implement the dispose pattern for releasing unmanaged resources.

IDisposable Uygulayan Nesneleri Kullanma Bir türdeki tüketicilerin, uygulamanın çağrılmasını nasıl sağladıklarını Dispose açıklar.Using Objects That Implement IDisposable Describes how consumers of a type ensure that its Dispose implementation is called. Bunu yapmak için using C# deyimini Using veya Visual Basic deyimini kullanmanızı öneririz.We recommend using the C# using statement or the Visual Basic Using statement to do this.

BaşvuruReference

System.IDisposable
Yönetilmeyen Dispose kaynakları serbest bırakma yöntemini tanımlar.Defines the Dispose method for releasing unmanaged resources.

Object.Finalize
Yöntem tarafından yönetilmeyen kaynaklar serbest bırakılmazsa nesne sonlandırma sağlar. DisposeProvides for object finalization if unmanaged resources are not released by the Dispose method.

GC.SuppressFinalize
Sonlandırmayı bastırır.Suppresses finalization. Bu yöntem, bir sonlandırıcının yürütülmesini önlemek için alışılmış bir Dispose yöntemden çağrılır.This method is customarily called from a Dispose method to prevent a finalizer from executing.