SORU
19 Mart 2009, PERŞEMBE


Nasıl tüm derslerine yayılmasını önlemek IDisposable musunuz?

Başlaması ile bu basit dersleri...

Diyelim ki böyle: sınıflar basit bir dizi var

class Bus
{
    Driver busDriver = new Driver();
}

class Driver
{
    Shoe[] shoes = { new Shoe(), new Shoe() };
}

class Shoe
{
    Shoelace lace = new Shoelace();
}

class Shoelace
{
    bool tied = false;
}

Shoe Shoelace her Bus Driver, Driver var Shoes,. Çok saçma.

IDisposable bir nesne Ayakkabı ekleyin

Daha sonra Shoelace bazı çalışma konuları ile iletişim kurmak için EventWaitHandle ekledim çok kanallı olabilir, buna ben karar veririm. Shoelace şimdi bu gibi görünüyor:

class Shoelace
{
    private AutoResetEvent waitHandle = new AutoResetEvent(false);
    bool tied = false;
    // ... other stuff ..
}

Ayakkabı bağı üzerinde IDisposable uygulamak

Ama şimdi FxCop şikayet edecektir:"'Aşağıdaki IDisposable türlerinin üyeleri oluşturur:'''." EventWaitHandle Ayakkabı bağı uygulamak IDisposable

Tamam, ben Shoelace güzel benim küçük sınıf IDisposable Bu korkunç karışıklık olur uygulamak:

class Shoelace : IDisposable
{
    private AutoResetEvent waitHandle = new AutoResetEvent(false);
    bool tied = false;
    private bool disposed = false;

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    ~Shoelace()
    {
        Dispose(false);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!this.disposed)
        {
            if (disposing)
            {
                if (waitHandle != null)
                {
                    waitHandle.Close();
                    waitHandle = null;
                }
            }
            // No unmanaged resources to release otherwise they'd go here.
        }
        disposed = true;
    }
}

Ya da ziyaretçi tarafından belirttiği gibi) Shoelace beri hiçbir yönetilmeyen kaynakları kendisi vardır, Dispose(bool) ve Yıkıcı kalmadan daha basit atma uygulaması kullanabilirim:

class Shoelace : IDisposable
{
    private AutoResetEvent waitHandle = new AutoResetEvent(false);
    bool tied = false;

    public void Dispose()
    {
        if (waitHandle != null)
        {
            waitHandle.Close();
            waitHandle = null;
        }
        GC.SuppressFinalize(this);
    }
}

IDisposable yayıldıkça korku içinde izle

Sağ sabit. Ama şimdi FxCop Shoe Shoelace, Shoe IDisposable de olmalı yani bir yaratan şikayet edecektir.

Driver Driver IDisposableolmalı Shoe oluşturur. Bus Bus IDisposable ve üzerinde olmalı Driver oluşturur.

Aniden Shoelace benim küçük değişiklik bana bir sürü iş neden olduğunu ve patronum Bus Shoelace bir değişiklik yapmak için ödeme yapmak istiyorum neden merak ediyor.

Soru

Nasıl IDisposable, Bu yayılmasını önlemek ama hala yönetilmeyen nesneleri düzgün bir şekilde atılmasını sağlar?

CEVAP
19 Mart 2009, PERŞEMBE


Gerçekten "" yayılmasını IDisposable. önüne geçemezsiniz Bazı sınıflar bertaraf edilmesi, AutoResetEvent ve en etkili yolu sonlandırıcı yükünü önlemek için Dispose() yöntemi yapmak gibi bir ihtiyaç. Ama bu yöntem bir şekilde çağrılmalıdır, örnek olarak saklanması ya da içeren IDisposable sınıfları tek kullanımlık olması da gerekir, bu vb kurtulmam gerekiyor. Bunu önlemek için tek yol vardır:

  • mümkünse IDisposable sınıfları kullanmaktan kaçının, kilit veya tek yerlerde olaylar bekleyin, tek bir yerde pahalı kaynakları, vb tutmak
  • sadece onlara ihtiyacınız olduğunda onları oluşturmak ve onları hemen sonra (using desen) atın

Bazı durumlarda IDisposable isteğe bağlı bir durum desteklediği için göz ardı edilebilir. Örneğin, WaitHandle uygular adlı bir Dışlama destek için IDisposable. Eğer bir isim kullanılıyorsa, Atma yöntemini hiçbir şey yapmaz. MemoryStream başka bir örnek, hiçbir sistem kaynaklarını kullanır ve uygulama Atmayın onun da hiçbir şey yapmaz. Yönetilmeyen bir kaynak kullanılmakta olup, olmadığı konusunda dikkatli düşünme öğretim olabilir. Böylece mevcut kaynakların incelenmesi .net kitaplıkları ya da bir hızlı yolu kullanarak.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Film Riot

    Film Riot

    16 NİSAN 2006
  • fireflame65

    fireflame65

    27 Mart 2007
  • PlayStation

    PlayStation

    16 Aralık 2005