Sonlandırıcılar (C# Programlama Kılavuzu)Finalizers (C# Programming Guide)

Sonlandırıcılar (yani Yıkıcılarolarak da bilinir), bir sınıf örneği çöp toplayıcısı tarafından toplandığında gerekli son temizleme işlemini gerçekleştirmek için kullanılır.Finalizers (which are also called destructors) are used to perform any necessary final clean-up when a class instance is being collected by the garbage collector.

AçıklamalarRemarks

  • Sonlandırıcılar yapılar içinde tanımlanamaz.Finalizers cannot be defined in structs. Bunlar yalnızca sınıflarla birlikte kullanılır.They are only used with classes.

  • Bir sınıfın yalnızca bir sonlandırıcısı olabilir.A class can only have one finalizer.

  • Sonlandırıcılar devralınamaz veya aşırı yüklenemez.Finalizers cannot be inherited or overloaded.

  • Sonlandırıcılar çağrılamaz.Finalizers cannot be called. Bunlar otomatik olarak çağırılır.They are invoked automatically.

  • Sonlandırıcı değiştirici almaz veya parametrelere sahip değildir.A finalizer does not take modifiers or have parameters.

Örneğin, Car sınıfı için sonlandırıcının bildirimi aşağıda verilmiştir.For example, the following is a declaration of a finalizer for the Car class.

class Car
{
    ~Car()  // finalizer
    {
        // cleanup statements...
    }
}

Bir Sonlandırıcı, aşağıdaki örnekte gösterildiği gibi bir ifade gövdesi tanımı olarak da uygulanabilir.A finalizer can also be implemented as an expression body definition, as the following example shows.

using System;

public class Destroyer
{
   public override string ToString() => GetType().Name;
   
   ~Destroyer() => Console.WriteLine($"The {ToString()} destructor is executing.");
}

Sonlandırıcı nesnenin temel sınıfında Finalize dolaylı olarak çağırır.The finalizer implicitly calls Finalize on the base class of the object. Bu nedenle, sonlandırıcının çağrısı dolaylı olarak aşağıdaki koda çevrilir:Therefore, a call to a finalizer is implicitly translated to the following code:

protected override void Finalize()  
{  
    try  
    {  
        // Cleanup statements...  
    }  
    finally  
    {  
        base.Finalize();  
    }  
}  

Bu, Finalize yönteminin devralma zincirindeki tüm örnekler için özyinelemeli olarak çağrıldığı, en az türetilen ' ın en küçük bir değer olarak çağrıldığı anlamına gelir.This means that the Finalize method is called recursively for all instances in the inheritance chain, from the most-derived to the least-derived.

Not

Boş sonlandırıcılar kullanılmamalıdır.Empty finalizers should not be used. Bir sınıf bir Sonlandırıcı içerdiğinde, Finalize kuyrukta bir giriş oluşturulur.When a class contains a finalizer, an entry is created in the Finalize queue. Sonlandırıcı çağrıldığında, atık toplayıcı kuyruğu işleyecek şekilde çağrılır.When the finalizer is called, the garbage collector is invoked to process the queue. Boş bir Sonlandırıcı yalnızca gereksiz performans kaybına neden olur.An empty finalizer just causes a needless loss of performance.

Bu, çöp toplayıcı tarafından belirlendiği için sonlandırıcının çağrıldığı zaman üzerinde denetime sahip değildir.The programmer has no control over when the finalizer is called because this is determined by the garbage collector. Çöp toplayıcı, artık uygulama tarafından kullanılmayan nesneleri denetler.The garbage collector checks for objects that are no longer being used by the application. Sonlandırma için uygun bir nesne kabul eder, sonlandırıcıyı çağırır (varsa) ve nesneyi depolamak için kullanılan belleği geri kazanır.If it considers an object eligible for finalization, it calls the finalizer (if any) and reclaims the memory used to store the object.

.NET Framework uygulamalarda (.NET Core uygulamalarında değil), program çıkıldığında sonlandırıcılar da çağırılır.In .NET Framework applications (but not in .NET Core applications), finalizers are also called when the program exits.

Collectçağırarak çöp toplamayı zorlamak mümkündür, ancak çoğu zaman performans sorunları oluşturabileceğinden bu durum kaçınılmalıdır.It is possible to force garbage collection by calling Collect, but most of the time, this should be avoided because it may create performance issues.

Kaynakları serbest bırakmak için sonlandırıcıları kullanmaUsing finalizers to release resources

Genel olarak, C# çöp toplama ile çalışma zamanını hedeflemez bir dille geliştirirken gereken kadar bellek yönetimi gerekmez.In general, C# does not require as much memory management as is needed when you develop with a language that does not target a runtime with garbage collection. Bunun nedeni, .NET Framework atık toplayıcının nesneleriniz için bellek ayırmayı ve serbest bırakma işlemini örtülü olarak yönetmesinden kaynaklanır.This is because the .NET Framework garbage collector implicitly manages the allocation and release of memory for your objects. Ancak, uygulamanız Windows, dosyalar ve ağ bağlantıları gibi yönetilmeyen kaynakları kapsüller, bu kaynakları serbest bırakmak için sonlandırıcıları kullanmanız gerekir.However, when your application encapsulates unmanaged resources such as windows, files, and network connections, you should use finalizers to free those resources. Nesne sonlandırmaya uygun olduğunda, çöp toplayıcı nesnenin Finalize yöntemini çalıştırır.When the object is eligible for finalization, the garbage collector runs the Finalize method of the object.

Kaynakların açık yayınıExplicit release of resources

Uygulamanız pahalı bir dış kaynak kullanıyorsa, atık toplayıcı nesneyi serbest bırakmadan önce kaynağı açıkça serbest bırakmak için bir yol sağlamanızı öneririz.If your application is using an expensive external resource, we also recommend that you provide a way to explicitly release the resource before the garbage collector frees the object. Bu, nesnesi için gerekli temizleme işlemini gerçekleştiren IDisposable arabiriminden bir Dispose yöntemi uygulayarak yapılır.You do this by implementing a Dispose method from the IDisposable interface that performs the necessary cleanup for the object. Bu, uygulamanın performansını önemli ölçüde iyileştirebilirler.This can considerably improve the performance of the application. Kaynak üzerinde bu açık denetimle birlikte, Dispose yöntemine yapılan çağrı başarısız olursa Sonlandırıcı, kaynakları temizlemek için bir güvenlik önlemi haline gelir.Even with this explicit control over resources, the finalizer becomes a safeguard to clean up resources if the call to the Dispose method failed.

Kaynakları Temizleme hakkında daha fazla bilgi için aşağıdaki konulara bakın:For more details about cleaning up resources, see the following topics:

ÖrnekExample

Aşağıdaki örnek, bir devralım zinciri oluşturan üç sınıf oluşturur.The following example creates three classes that make a chain of inheritance. Sınıf First temel sınıftır, Second Firsttüretilir ve Third Secondtüretilir.The class First is the base class, Second is derived from First, and Third is derived from Second. Tüm üçünün sonlandırıcıları vardır.All three have finalizers. Main, en çok türetilen sınıfın bir örneği oluşturulur.In Main, an instance of the most-derived class is created. Program çalıştığında, üç sınıfa ait sonlandırıcılara otomatik olarak ve sırasıyla en az türetilmiş ' dan türetilmiş ' a göre çağrıldığını unutmayın.When the program runs, notice that the finalizers for the three classes are called automatically, and in order, from the most-derived to the least-derived.

class First
{
    ~First()
    {
        System.Diagnostics.Trace.WriteLine("First's destructor is called.");
    }
}

class Second : First
{
    ~Second()
    {
        System.Diagnostics.Trace.WriteLine("Second's destructor is called.");
    }
}

class Third : Second
{
    ~Third()
    {
        System.Diagnostics.Trace.WriteLine("Third's destructor is called.");
    }
}

class TestDestructors
{
    static void Main()
    {
        Third t = new Third();
    }
}
/* Output (to VS Output Window):
    Third's destructor is called.
    Second's destructor is called.
    First's destructor is called.
*/

C# dili belirtimiC# language specification

Daha fazla bilgi için C# dil belirtiminin Yıkıcılar bölümüne bakın.For more information, see the Destructors section of the C# language specification.

Ayrıca bkz.See also