C # 2008
Tôi đã làm việc này được một thời gian và tôi vẫn còn bối rối về việc sử dụng các phương thức hoàn thiện và loại bỏ trong mã. Câu hỏi của tôi dưới đây:
Tôi biết rằng chúng ta chỉ cần một bộ hoàn thiện trong khi xử lý các tài nguyên không được quản lý. Tuy nhiên, nếu có các tài nguyên được quản lý thực hiện các cuộc gọi đến các tài nguyên không được quản lý, liệu nó có còn cần phải thực hiện một bộ hoàn thiện không?
Tuy nhiên, nếu tôi phát triển một lớp không sử dụng bất kỳ tài nguyên không được quản lý nào - trực tiếp hoặc gián tiếp, tôi có nên thực hiện
IDisposable
để cho phép các máy khách của lớp đó sử dụng 'câu lệnh sử dụng' không?Liệu có khả thi khi triển khai IDis Dùng chỉ để cho phép các máy khách của lớp bạn sử dụng câu lệnh sử dụng không?
using(myClass objClass = new myClass()) { // Do stuff here }
Tôi đã phát triển mã đơn giản dưới đây để chứng minh việc sử dụng Hoàn tất / loại bỏ:
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); } }
Câu hỏi về mã nguồn:
Ở đây tôi chưa thêm trình hoàn thiện, và thông thường, trình hoàn thiện sẽ được gọi bởi GC và trình hoàn thiện sẽ gọi là Dispose. Khi tôi không có bộ hoàn thiện, khi nào tôi gọi phương thức Vứt bỏ? Nó có phải là khách hàng của lớp phải gọi nó không?
Vì vậy, lớp của tôi trong ví dụ được gọi là NoGateway và khách hàng có thể sử dụng và loại bỏ lớp như thế này:
using(NoGateway objNoGateway = new NoGateway()) { // Do stuff here }
Phương thức Vứt bỏ sẽ được tự động gọi khi thực thi đến hết khối sử dụng, hay máy khách phải gọi thủ công phương thức vứt bỏ? I E
NoGateway objNoGateway = new NoGateway(); // Do stuff with object objNoGateway.Dispose(); // finished with it
Tôi đang sử dụng
WebClient
lớp học trongNoGateway
lớp học của tôi . Bởi vìWebClient
thực hiệnIDisposable
giao diện, điều này có nghĩa làWebClient
gián tiếp sử dụng tài nguyên không được quản lý? Có một quy tắc cứng và nhanh để làm theo điều này? Làm thế nào để tôi biết rằng một lớp sử dụng tài nguyên không được quản lý?