Aracılığıyla paylaş


Finally anahtar sözcüğünü kullanarak temizleme kodu yürütme

Deyiminin finally amacı, bir özel durum oluşturulmuş olsa bile, genellikle dış kaynakları tutan nesnelerin gerekli temizleme işleminin hemen gerçekleşmesini sağlamaktır. Bu tür bir FileStream temizleme örneği, Close nesnesinin ortak dil çalışma zamanı tarafından atık olarak toplanması yerine kullanımdan hemen sonra çağrısı yapmaktır:

static void CodeWithoutCleanup()
{
    FileStream? file = null;
    FileInfo fileInfo = new FileInfo("./file.txt");

    file = fileInfo.OpenWrite();
    file.WriteByte(0xF);

    file.Close();
}

Örnek

Önceki kodu deyime try-catch-finally dönüştürmek için, temizleme kodu aşağıdaki gibi çalışma kodundan ayrılır.

static void CodeWithCleanup()
{
    FileStream? file = null;
    FileInfo? fileInfo = null;

    try
    {
        fileInfo = new FileInfo("./file.txt");

        file = fileInfo.OpenWrite();
        file.WriteByte(0xF);
    }
    catch (UnauthorizedAccessException e)
    {
        Console.WriteLine(e.Message);
    }
    finally
    {
        file?.Close();
    }
}

Çağrıdan önce blok içinde try herhangi bir zamanda bir özel durum oluşabileceğinden veya çağrının OpenWrite() kendisi başarısız olabileceğinden, dosyayı kapatmaya çalışırken dosyanın açık olduğundan emin OpenWrite() değiliz. bloğu, finally yöntemini çağırmadan Close önce nesnenin FileStream olmadığından null emin olmak için bir denetim ekler. null Denetim olmadan, finally blok kendi NullReferenceExceptionoluşturabiliyordu, ancak mümkünse bloklara finally özel durumlar oluşturmaktan kaçınılmalıdır.

Veritabanı bağlantısı, bir blokta kapatılmak için iyi bir finally adaydır. Veritabanı sunucusuna izin verilen bağlantı sayısı bazen sınırlı olduğundan, veritabanı bağlantılarını mümkün olan en kısa sürede kapatmanız gerekir. Bağlantınızı kapatabilmeniz için bir özel durum oluşursa, bloğu kullanmak finally çöp toplamayı beklemekten daha iyidir.

Ayrıca bkz.