Nesneleri Visual Basic'te eleme

click fraud protection

Yeni Nesne Örneklerini Kodlama makalesinde, çeşitli yollar hakkında yazdım. Yeni nesnelerin örnekleri oluşturulabilir. Tersi problem, bir nesneyi elden çıkarmak, VB.NET'te çok sık endişelenmenize gerek kalmayacak bir şeydir. .NET adlı bir teknoloji içerir. Çöp toplayıcı (GC) sahne arkasındaki her şeyi sessiz ve verimli bir şekilde halleder. Ancak bazen, genellikle dosya akışlarını, sql nesnelerini veya grafik (GDI +) nesnelerini (yani, yönetilmeyen kaynaklar), kendi kodunuzdaki nesneleri elden çıkarma kontrolünü ele almanız gerekebilir.

İlk olarak, bazı arka plan

Tıpkı bir aleyhteyapıcı ( Yeni anahtar kelime) yeni oluşturur nesne, bir deconstructor, bir nesne yok edildiğinde çağrılan bir yöntemdir. Ama bir sorun var. .NET'i oluşturan insanlar, iki farklı kod parçası bir nesneyi gerçekten yok ederse, hatalar için bir formül olduğunu fark etti. Yani .NET GC aslında kontrol altındadır ve genellikle nesnenin örneğini yok edebilen tek koddur. GC, bir nesneyi daha önce değil de daha önce karar verdiğinde yok eder. Normalde, bir nesne kapsamdan ayrıldıktan sonra,

instagram viewer
yayınlandı ortak dil çalışma zamanı (CLR) tarafından. GC bunları tahrip daha fazla boş hafızaya ihtiyaç duyduğunda nesneler. Sonuç olarak, GC'nin nesneyi ne zaman yok edeceğini tahmin edemezsiniz.

(Welllll... Bu doğru neredeyse tüm zamanların. Arayabilirsin GC.Collect ve zorla çöp toplama çevrimi, ancak yetkililer evrensel olarak bunun bir kötü fikir ve tamamen gereksiz.)

Örneğin, kodunuz bir Müşteri nesne, bu kod tekrar yok edecek gibi görünebilir.

Müşteri = Hiçbir şey

Ama öyle değil. (Bir nesneyi Hiçbir şeye ayarlamak genellikle yaygın olarak adlandırılır, dereferencing ) Aslında, değişkenin artık bir nesne ile ilişkili olmadığı anlamına gelir. Bir süre sonra, GC nesnenin imha için uygun olduğunu fark edecektir.

Bu arada, yönetilen nesneler için bunların hiçbiri gerçekten gerekli değildir. Düğme gibi bir nesne bir Atma yöntemi sunsa da, bunu kullanmak gerekli değildir ve çok az kişi bunu yapar. Örneğin, Windows Forms bileşenleri adlı bir kapsayıcı nesnesine eklenir bileşenler. Bir formu kapattığınızda otomatik olarak Dispose yöntemi çağrılır. Genellikle, yönetilmeyen nesneleri kullanırken ve sadece o zaman bile programınızı optimize etmek için bunlardan herhangi biri hakkında endişelenmeniz gerekir.

Bir nesne tarafından tutulabilecek kaynakları serbest bırakmanın önerilen yolu, Elden çıkarmak (varsa) nesneyi kullanın ve sonra nesneyi kaldırın.

Müşteri. Elden çıkarmak() Müşteri = Hiçbir şey

GC, nesne değişkenini Hiçbir şey olarak ayarlasanız da ayarlamasanız da artık bir nesneyi yok edeceğinden, bu gerçekten gerekli değildir.

Artık ihtiyaç duyulmadığında nesnelerin imha edildiğinden emin olmak için önerilen başka bir yol, bir nesneyi kullanan kodu bir nesneye kullanma blok. A kullanma bloğu, kodunuz tamamlandığında bu tür bir veya daha fazla kaynağın atılmasını garanti eder.

GDI + serisinde, kullanma bloğu bu sinir bozucu grafik nesnelerini yönetmek için oldukça sık kullanılır. Örneğin ...

MyBrush'ı LinearGradientBrush _ olarak kullanma. = Yeni LinearGradientBrush (_. Ben mi. ClientRectangle, _. Renk. Mavi renk. Kırmızı, _. LinearGradientMode. Yatay) <... daha fazla kod ...> Kullanmayı Sonlandır

MyBrush, blok sonu yürütüldüğünde otomatik olarak atılır.

Belleği yönetmeye yönelik GC yaklaşımı, VB6'nın yaptığı gibi büyük bir değişikliktir. Dahili referans sayacı sıfıra ulaştığında COM nesneleri (VB6 tarafından kullanılır) yok edildi. Ancak hata yapmak çok kolaydı, bu yüzden iç sayaç kapalıydı. (Bellek bağlandığından ve bu olduğunda diğer nesneler tarafından kullanılamadığından buna "bellek sızıntısı" denir.) Bunun yerine, GC aslında bir nesneye referansta bulunup bulunmadığını kontrol eder ve artık yokken onu yok eder Referanslar. GC yaklaşımı Java gibi dillerde iyi bir geçmişe sahiptir ve .NET'teki büyük gelişmelerden biridir.

Bir sonraki sayfada, IDisposable arayüzüne bakıyoruz... yönetilmeyen nesneleri kendi kodunuza atmanız gerektiğinde kullanılacak arabirim.

Yönetilmeyen kaynaklar kullanan kendi nesnenizi kodlarsanız, ıdisposable nesne için arabirim. Microsoft, sizin için doğru modeli oluşturan bir kod snippet'i ekleyerek bunu kolaylaştırır.


Resmi görüntülemek için Buraya tıklayın
Geri dönmek için tarayıcınızdaki Geri düğmesini tıklayın

Eklenen kod şöyle görünür (VB.NET 2008):

 Sınıf ResourceClass. IDisposable uygular. 'Gereksiz çağrıları algılamak için. Boolean As özel olarak atılmış = Yanlış. 'Tek kullanımlık. Korumalı Geçersiz Kılınan Alt Atma (_. ByVal bertarafı olarak Boolean). Bertaraf ediyorsanız O zaman. 'Özgür başka devlet (yönetilen nesneler). End If. 'Kendi durumunuzu özgür bırakın (yönetilmeyen nesneler). 'Geniş alanları boş olarak ayarlayın. End If. Me.disposed = Doğru. End Sub. #Bölge "IDisposable Support" 'Bu kod, Visual Basic tarafından eklenmiştir. Tek kullanımlık modeli doğru şekilde uygulayın. Public Sub Dispose () Uygulanabilir IDisposable. Elden çıkarmak. 'Bu kodu değiştirmeyin. 'Temizleme kodunu girin. 'Bertaraf edin (ByVal bertaraf etme). (Doğru) GC.SuppressFinalize (Me) End Sub. Korumalı Geçersiz Kılmalar Sub Finalize () 'Bu kodu değiştirmeyin. 'Temizleme kodunu girin. 'Bertaraf edin (ByVal bertaraf etme). (Yanlış) MyBase'i atın. Sonlandır () Son Sub. # Bölge. Bitiş Sınıfı 

Elden çıkarmak .NET'te neredeyse "zorunlu" bir geliştirici tasarım modelidir. Bunu yapmanın tek bir doğru yolu var ve işte bu. Bu kodun sihirli bir şey yaptığını düşünebilirsiniz. Öyle değil.

İç bayrağın tanzim basitçe her şeyi kısa devre yapar, böylece arayabilirsiniz Atma (atma) istediğiniz sıklıkta.

Kod ...

 GC.SuppressFinalize (Ben) 

... GC'ye nesnenin zaten atıldığını söyleyerek kodunuzu daha verimli hale getirir (yürütme döngüleri açısından 'pahalı' bir işlem). Sonlandırma Korumalı çünkü bir nesne yok edildiğinde GC otomatik olarak çağırır. Asla Finalize dememelisin. Boole bertaraf koda, kodunuzun nesnenin imhasını başlatıp başlatmadığını (True) veya GC'nin bunu yapıp yapmadığını ( Sonuçlandırmak alt. Boolean kullanan tek kodun bertaraf dır-dir:

 Bertaraf ediyorsanız O zaman. 'Özgür başka devlet (yönetilen nesneler). End If 

Bir nesneyi attığınızda, tüm kaynakları atılmalıdır. Ne zaman CLR Çöp toplayıcı bir nesnenin atılması yalnızca yönetilmeyen kaynakların atılması gerekir, çünkü çöp toplayıcı yönetilen kaynaklara otomatik olarak bakar.

Bu kod snippet'inin arkasındaki fikir, belirtilen konumlardaki yönetilen ve yönetilmeyen nesnelere bakmak için kod eklemenizdir.

Bir sınıf türettiğinizde temel sınıf IDisposable'ı uygulayan, bertaraf edilmesi gereken diğer kaynakları kullanmadığınız sürece, temel yöntemlerden herhangi birini geçersiz kılmak zorunda değilsiniz. Bu durumda, türetilmiş sınıf türetilmiş sınıfın kaynaklarını atmak için temel sınıfın Dispose (disposing) yöntemini geçersiz kılmalıdır. Ancak, temel sınıfın Dispose (bertaraf) yöntemini çağırmayı unutmayın.

Korumalı Geçersiz Kılmalar Alt Atma (ByVal bertaraflı olarak bertaraf edilir) Me Me değilse. Bertaraf ediyorsanız O zaman. 'Kodunuzu ücretsiz yönetilen kaynaklara ekleyin. End If. 'Yönetilmeyen kaynaklara ücretsiz kod ekleyin. End If. MyBase. Atma (atma) End Sub

Konu biraz ezici olabilir. Buradaki açıklamanın amacı, gerçekte ne olduğunu "belirsizleştirmektir", çünkü bulabileceğiniz bilgilerin çoğu size söylemez!

instagram story viewer