SORU
20 Ocak 2010, ÇARŞAMBA


IDisposable ve "kullanarak" onu almak için bir yol "kapsamlı davranış" özel güvenlik için kullanılacak Peki bu kötü mü?

Bir şey sık sık kullanılan geri C icar sınıf A tanıtıcı bir devlet giriş ve çıkış durumu için başka bir sınıf B üzerinden A yapıcı ve yıkıcı, emin olmak için eğer bir şey bu kapsam attı bir istisna, sonra B diye bilinen bir devlet ne zaman kapsamında olduğunu çıkıldı. Bu saf DEMİRYOLU kısaltma gittiği kadar değil, ama kurulmuş bir desen yine de.

C#, sık sık yapmak istiyorum

class FrobbleManager
{
    ...

    private void FiddleTheFrobble()
    {
        this.Frobble.Unlock();
        Foo();                  // Can throw
        this.Frobble.Fiddle();  // Can throw
        Bar();                  // Can throw
        this.Frobble.Lock();
    }
}

Böyle yapılması gerekiyor

private void FiddleTheFrobble()
{
    this.Frobble.Unlock();

    try
    {            
        Foo();                  // Can throw
        this.Frobble.Fiddle();  // Can throw
        Bar();                  // Can throw
    }
    finally
    {
        this.Frobble.Lock();
    }
}

FiddleTheFrobble döner Frobble devlet garantisi istiyorum. Kod ile daha güzel olurdu

private void FiddleTheFrobble()
{
    using (var janitor = new FrobbleJanitor(this.Frobble))
    {            
        Foo();                  // Can throw
        this.Frobble.Fiddle();  // Can throw
        Bar();                  // Can throw
    }
}

FrobbleJanitor görünüyorkabacagibi

class FrobbleJanitor : IDisposable
{
    private Frobble frobble;

    public FrobbleJanitor(Frobble frobble)
    {
        this.frobble = frobble;
        this.frobble.Unlock();
    }

    public void Dispose()
    {
        this.frobble.Lock();
    }
}

Ve bunu yapmak istiyorum. Şimdi ben gerçeğin bu yana yakalaristiyorumkullanmak içingerektirirFrobbleJanitor kullanılırileusing. Bu kod Gözden Geçirme bir sorun düşünebilirim, ama bir şey beni rahatsız ediyor.

Soru:Yukarıdaki using IDisposable kötüye kullanılması olarak mı kabul edilir?

CEVAP
20 Ocak 2010, ÇARŞAMBA


Bu deyimi kullanarak bir taciz olarak görüyorum. Bu pozisyon azınlıkta olduğumun farkındayım.

Bu üç sebep için bir istismar olduğunu düşünüyorum.

"Kullanma" için kullanılır . bekliyorum çünkü ilk, ^em>bir kaynak kullanınveonunla işin bitince çöpe atın. Program devlet değişmiyorbir kaynak kullanarakve geri değişiyoryardımcı olduğuhiçbir şey. Bu nedenle, "," devlet mutasyona geri yüklemek için bir istismar, kod, sıradan bir okuyucu için yanıltıcı. kullanarak

""Kullanılmış . be bekliyorum çünkü ikinci, ^em>nezaket icabıydı, zorunluluk değil. Sebebi kullandığınız "olduğundan değil bitince" bir dosya atıngerekliçünkü bunu yapmak için, amakibar-- başka biri bu dosyayı kullanmak için, "artık bitti" yapmak ahlaki açıdan doğru şey. demek bu yüzden bekliyor olabilir Bir "kullanılan kaynak için daha uzun tutarak ve bertaraf sonra yapılan, ve bunu yapmanın tek etkisi bu ." kullanarak yeniden edebilmeliyim bekliyorum ^em>biraz rahatsızlık diğer işler. Bir "kullanma" olan blokprogram devlet anlamsal etkisibu kolaylık ve nezaket için var gibi görünen bir yapı içinde program devletin önemli, gerekli bir mutasyona gizler çünkü küfürlü, zorunluluk değil.

Ve üçüncü olarak, programınızın eylemleri durumuna göre belirlenir; devletin dikkatli manipülasyon için gereken ilk etapta bu konuşmayı yapmamızın nedeni buydu. Hadi orijinal programı analiz düşünmeleri.

Bu kod incelemesi için ofisimde, sorardım ilk soru "gerçekten eğer bir özel durum ise frobble kilitlemek doğru mu?" getir edildi Pervasızca bu işi titizlikle yeniden kilitler frobble ne olursa olsun bu programdan açıktır.Bu doğru mu?Bir özel durum oluşturuldu. Program bilinmeyen bir durumda. Foo, Keman veya Bar attı ister, onlar neden attığını bilmiyoruz, ya da diğer devlet için yaptılar ne o temizlenmiş değildi. Yapabilirsiniziknabeni bu berbat durumdaher zamantekrar kilitlemek için yapılacak en doğru şey?

Belki, belki de değil. Benim açımdan aslında yazılı olarak kodlakod inceleme soru sormak bilir. Kodu kullanan "kullanarak", bilmiyorum için sorulması gereken soru şu; sanırım bu "kullanma" ayırır bir kaynak kullanır, bunun için biraz kibarca hizmetinde o zaman olan oldu, değilkapanış ayracı"blok . kullanarak ^em>mutasyona keyfi olarak birçok program devlet tutarlılık koşulları ihlal edildiğinde olağanüstü bir cirumstance program benim devlet.

"Semantik bir etkiye sahip bu program parçası yapar blok: . kullanarak kullanın

}

son derece anlamlı. Ne zaman ki tek yakın bakıyorum hemen düşünmüyorum brace "brace geniş kapsamlı programım genel durum üzerinde etkileri olan yan etkileri vardır". Ama ne zaman "kullanarak" bu, aniden yapar. gibi istismar

İkinci şey ise eğer orijinal kodu "eğer bir istisna deneyin girilmeden önce Unlock sonra ama atılırsa ne olur?" ise gördüm rica ederim Eğer çalışan bir non-optimize derleme, derleyici olabilir eklenen bir no-op talimat önce deneyin ve mümkün bir iş parçacığı iptal durum başına hiçbir-op. Bu çok nadirdir, ama gerçek hayatta, özellikle web sunucularında yer oluyor. Bu durumda, özel çalışmadan önce atıldı çünkü kilit olmadı ama kilidini açmak. Bu kod, bu soruna çok hassas, aslında yazılı olması tamamen mümkündür

bool needsLock = false;
try
{
    // must be carefully written so that needsLock is set
    // if and only if the unlock happened:

    this.Frobble.AtomicUnlock(ref needsLock);
    blah blah blah
}
finally
{
    if (needsLock) this.Frobble.Lock();
}

Yine, belki öyle belki de değil, ama değilSoru sormak biliyorum. "Kullanan" sürümü, duyarlı aynı sorun: bir iş parçacığı iptal durum olabilir atılan sonra Frobble kilitli ama önce denemek korumalı bölge ile ilgili kullanarak girdi. ""Sürümü, bu "ne?" durumu. o yüzden olduğunu sanıyorum kullanarak ama Eğer böyle bir şey olursa, ama bu "sadece nazik olmak için, hayati önem taşıyan program devlet. mutasyona değil" kullanarak sanırım şanssızlık Ben ise korkunç bir iş parçacığı iptal durum tam olarak yanlış bir zamanda olursa, oh iyi, çöp toplayıcı, kaynak sonunda sonlandırıcı çalıştırarak temizler varsayalım.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • B3ASTTY™

    B3ASTTY™

    27 Mayıs 2013
  • jcortes187

    jcortes187

    24 Mart 2006
  • NextKsa

    NextKsa

    7 EKİM 2009