SORU
23 ŞUBAT 2009, PAZARTESİ


IDisposable uygulamak gerekir.() Elden hiç atar?

C eşdeğer mekanizması (yıkıcı) için tavsiyeler it should usually not throw any exceptions. Bu esas böyle yaparak çok nadiren iyi bir strateji sadece işleminizi, iptal olabilir.

Eşdeğer senaryoda .NET ...

  1. İlk bir istisna atılır
  2. Sonunda bir blok, ilk istisna olarak yürütülür
  3. Sonunda blok Atmayın aramaları() yöntemi
  4. () Bertaraf yöntemi ikinci bir istisna atar

... sürecinizi hemen sonlandırın. Ancak, bilgi çünkü kaybedersiniz .NET unceremoneously ikincisi ile ilk özel durum değiştirir. Bir bit yeniği çağrı blok yığını bu nedenle hiç istisna göreceksiniz. Ancak, normalde işler ters gitmeye başladı neden daha iyi ipuçları verir, çünkü genellikle ilk durum daha fazla ilgi.

Beri .NET bir mekanizma kod bir özel durum beklemedeyken yürütülmekte olup olmadığını tespit etmek için yoksun, öyle görünüyor ki gerçekten IDisposable nasıl uygulanabilir sadece iki seçenek vardır:

  • Her zaman Atın içinde oluşan tüm özel durumları Kırlangıç(). Ayrıca OutOfMemoryException, ExecutionEngineException, vb yutma sonunda olabilir gibi iyi değil. genellikle oldukça olmadan ortaya çıktığında süreci yerle bir durum zaten bekleyen izin verirdim.
  • Tüm özel durumları Atın dışarı yayılmasına izin(). Bilgi kaybedebilirsiniz olarak değil, iyi bir sorunun kök nedeni hakkında, yukarıya bakın.

Yani, daha az iki kötülükleri? Daha iyi bir yolu var mı?

EDİT: Açıklığa kavuşturmak için, ondan bahsetmiyorum aktif atarak özel Bertaraf() ya da değil, neden söz ettiğimi izin istisnalar fırlatılması yöntemleri ile İmha() yaymak dışarı Atmayın() ya da değil, örneğin:

using System;
using System.Net.Sockets;

public sealed class NntpClient : IDisposable
{
    private TcpClient tcpClient;

    public NntpClient(string hostname, int port)
    {
        this.tcpClient = new TcpClient(hostname, port);
    }

    public void Dispose()
    {
        // Should we implement like this or leave away the try-catch?
        try
        {
            this.tcpClient.Close(); // Let's assume that this might throw
        }
        catch
        {
        }
    }
}

CEVAP
23 ŞUBAT 2009, PAZARTESİ


Framework Design Guidelines (2nded) (§9.4.1) olduğu gibi:

ÖNLEMEKatma kritik altında dışında İmha içinden bir istisna(bool) içeren süreci (sızıntı, tutarsız bozuk olduğu durumlarda paylaşılan durum, vb.).

Yorum [Edit]:

  • Kurallar, sert kuralları vardır. Ve bu bir "" "kılavuz." değil bir KAÇININ. Olarak Çerçeve yerlerde (ve diğer) bu kurallar tatili (yorum) kaydetti. Hile bir kılavuz kırmak için zaman bilmektir. Bu, birçok yönden, bir Kalfa ve bir Usta arasındaki farktır.
  • Eğer temizlik kısmı başarısız olsaydı o zaman arayanın onları işleyebilir çok özel durumlar yaratacak olan Yakın bir yöntem sağlar.
  • Eğer aşağıdaki atmayın desen (ve olmalıdır eğer bu tür doğrudan ya da içeren bazı yönetilmeyen kaynak) Dispose(bool) çağrılabilir, finaliser, atma bir finaliser kötü bir fikir ve engeller diğer nesneler olmaktan tamamladi.

Benimgörünüm: başka güvenilir işlev geçerli işlem mümkün olan istisnalar Elden kaçan sadece o, kılavuz gibi olmalı, yeterince felaket gibi.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 2ndfloor91

    2ndfloor91

    17 Kasım 2007
  • Pál Zoltán Illés

    Pál Zoltán

    30 NİSAN 2007
  • TheDroidDemos

    TheDroidDemo

    15 ŞUBAT 2011