C # 2008
Bir süredir bunun üzerinde çalışıyorum ve hala kodda sonlandırma ve atma yöntemlerinin kullanımı hakkında kafam karıştı. Sorularım aşağıda:
Yönetilmeyen kaynakları elden çıkarırken yalnızca bir sonlandırıcıya ihtiyacımız olduğunu biliyorum. Ancak, yönetilmeyen kaynaklara çağrı yapan yönetilen kaynaklar varsa, yine de bir sonlandırıcı uygulaması gerekir mi?
Ancak, herhangi bir yönetilmeyen kaynak kullanmayan bir sınıf geliştirirsem - doğrudan veya dolaylı olarak,
IDisposable
bu sınıftaki istemcilerin 'using deyimini' kullanmasına izin vermek için şunu uygulamalıyım ?Yalnızca sınıfınızın istemcilerinin using deyimini kullanmasını sağlamak için IDisposable'ı uygulamak mümkün müdür?
using(myClass objClass = new myClass()) { // Do stuff here }
Sonlandırma / atma kullanımını göstermek için aşağıdaki basit kodu geliştirdim:
public class NoGateway : IDisposable { private WebClient wc = null; public NoGateway() { wc = new WebClient(); wc.DownloadStringCompleted += wc_DownloadStringCompleted; } // Start the Async call to find if NoGateway is true or false public void NoGatewayStatus() { // Start the Async's download // Do other work here wc.DownloadStringAsync(new Uri(www.xxxx.xxx)); } private void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { // Do work here } // Dispose of the NoGateway object public void Dispose() { wc.DownloadStringCompleted -= wc_DownloadStringCompleted; wc.Dispose(); GC.SuppressFinalize(this); } }
Kaynak kodu hakkında soru:
Burada sonlandırıcıyı eklemedim ve normalde sonlandırıcı GC tarafından çağrılacak ve sonlandırıcı Dispose olarak adlandırılacaktır. Sonlandırıcıya sahip olmadığım için ne zaman Dispose yöntemini çağırırım? Sınıfın istemesi gereken istemci mi?
Yani örnekteki sınıfım NoGateway olarak adlandırılır ve istemci sınıfı aşağıdaki gibi kullanabilir ve atabilir:
using(NoGateway objNoGateway = new NoGateway()) { // Do stuff here }
Yürütme, kullanım bloğunun sonuna geldiğinde Dispose yöntemi otomatik olarak çağrılır mı veya istemcinin dispose yöntemini el ile çağırması mı gerekir? yani
NoGateway objNoGateway = new NoGateway(); // Do stuff with object objNoGateway.Dispose(); // finished with it
WebClient
Sınıfı sınıfımda kullanıyorumNoGateway
. ÇünküWebClient
uygularIDisposable
arayüzünde bu demekWebClient
dolaylı yönetilmeyen kaynakları kullanır? Bunu takip etmek zor ve hızlı bir kural var mı? Bir sınıfın yönetilmeyen kaynaklar kullandığını nasıl bilebilirim?