Bunu, kullanım ifadesinin kötüye kullanılması olarak görüyorum. Bu pozisyonda azınlıkta olduğumun farkındayım.
Bunu üç nedenden dolayı kötüye kullanma olarak görüyorum.
Birincisi, "kullanma" nın bir kaynağı kullanmak ve onunla işiniz bittiğinde onu atmak için kullanılmasını bekliyorum . Program durumunu değiştirmek bir kaynak kullanmamaktır ve onu geri değiştirmek hiçbir şeyi elden çıkarmaz. Bu nedenle, durumu değiştirmek ve geri yüklemek için "kullanmak" kötüye kullanımdır; kod sıradan okuyucular için yanıltıcıdır.
İkincisi, "kullanma" nın gereklilikten değil, nezaketten kullanılmasını bekliyorum . İşiniz bittiğinde bir dosyayı imha etmek için "kullanma" seçeneğini kullanmanızın nedeni, bunun gerekli olması değil, kibar olmasıdır - başka biri o dosyayı kullanmak için bekliyor olabilir, bu yüzden "bitti" şimdi "ahlaki olarak yapılacak doğru şeydir. Kullanılmış kaynağın daha uzun süre tutulması ve daha sonra atılması için bir "kullanımı" yeniden düzenleyebilmeyi ve bunu yapmanın tek etkisinin diğer süreçleri biraz rahatsız etmek olmasını bekliyorum . Program durumu üzerinde anlamsal etkisi olan "kullanan" bir blok zorunluluk değil, kolaylık ve nezaket için varmış gibi görünen bir yapıda program durumunun önemli, gerekli bir mutasyonunu gizlediği için kötüye kullanılır.
Üçüncüsü, programınızın eylemleri durumuna göre belirlenir; Devletin dikkatli manipülasyonuna duyulan ihtiyaç tam da bu konuşmayı ilk etapta yapmamızın nedenidir. Orijinal programınızı nasıl analiz edebileceğimizi düşünelim.
Bunu ofisimdeki bir kod incelemesine götürseydiniz, soracağım ilk soru "bir istisna atılırsa frobble'ı kilitlemek gerçekten doğru mu?" Programınızdan, bu şeyin ne olursa olsun gevezeliği agresif bir şekilde yeniden kilitlediği apaçık ortadadır. Bu doğru mu? Bir istisna atıldı. Program bilinmeyen bir durumda. Foo, Fiddle veya Bar'ın atıp atmadığını, neden fırlattıklarını veya temizlenmemiş başka bir duruma hangi mutasyonları gerçekleştirdiklerini bilmiyoruz. Beni o korkunç durumda yeniden kilitlemenin her zaman yapılacak doğru şey olduğuna ikna edebilir misin ?
Belki öyledir, belki de değildir. Demek istediğim, kod ilk yazıldığı haliyle , kod gözden geçiren kişinin soruyu sorması gerektiğini biliyor . "Kullanarak" kullanan kodla, soruyu sormam gerektiğini bilmiyorum; Bunun, yapılmazsa o zaman blok ayırır kaynak, biraz kullanır bunu ve bunun kibarca hizmetinde "kullanılarak" farz kapanış ayracı "kullanılarak" blok içinde mutasyon keyfi pek istisnai cirumstance içinde benim program devlet program durumu tutarlılık koşulları ihlal edildi.
Anlamsal bir etkiye sahip olmak için "kullanma" bloğunun kullanılması, bu program parçasını yapar:
}
son derece anlamlı. Bu tek yakın ayraca baktığımda, "bu küme ayracın, programımın küresel durumu üzerinde geniş kapsamlı etkileri olan yan etkileri olduğunu" hemen düşünmüyorum. Ama bu şekilde "kullanmayı" kötüye kullandığınızda, aniden kötüye gidiyor.
Orijinal kodunuzu görürsem soracağım ikinci şey, "Kilit Açma işleminden sonra ancak deneme girilmeden önce bir istisna atılırsa ne olur?" Optimize edilmemiş bir derleme çalıştırıyorsanız, derleyici denemeden önce işlemsiz bir talimat eklemiş olabilir ve işlemsiz durumda bir iş parçacığı iptal istisnasının gerçekleşmesi mümkündür. Bu nadirdir, ancak gerçek hayatta özellikle web sunucularında olur. Bu durumda, kilit açma gerçekleşir ancak kilit asla olmaz, çünkü istisna denemeden önce fırlatılır. Bu kodun bu soruna karşı savunmasız olması tamamen mümkündür ve aslında yazılmalıdı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 olabilir, belki olmaz, ama soruyu sormayı biliyorum . "Kullanan" sürümle, aynı soruna karşı hassastır: Frobble kilitlendikten sonra, ancak kullanımla ilişkili deneme korumalı bölge girilmeden önce bir iş parçacığı iptal istisnası atılabilir. Ancak "kullanma" sürümüyle, bunun "ne olmuş yani?" Olduğunu varsayıyorum. durum. Bunun olması talihsiz bir durumdur, ancak "kullanma" nın hayati önem taşıyan program durumunu değiştirmek için değil, yalnızca kibar olmak için olduğunu varsayıyorum. Sanırım, bazı korkunç iş parçacığı iptali istisnası tam olarak yanlış zamanda meydana gelirse, o zaman, o zaman, çöp toplayıcının sonunda sonlandırıcıyı çalıştırarak bu kaynağı temizleyeceğini varsayıyorum.