C#2008
我已经为此工作了一段时间,但我仍然对在代码中使用finalize和dispose方法感到困惑。我的问题如下:
我知道在处理非托管资源时我们只需要一个终结器即可。但是,如果存在调用非托管资源的托管资源,是否仍需要实现终结器?
但是,如果我开发的类不直接或间接使用任何非托管资源,是否应该实现,
IDisposable
以允许该类的客户端使用“ using语句”?实现IDisposable只是为了使您的类的客户端能够使用using语句是否可行?
using(myClass objClass = new myClass()) { // Do stuff here }
我在下面开发了这个简单的代码来演示Finalize / dispose的使用:
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); } }
有关源代码的问题:
在这里,我没有添加终结器,通常,终结器将由GC调用,而终结器将调用Dispose。由于没有终结器,何时可以调用Dispose方法?是该类的客户必须调用它吗?
因此,在示例中,我的类称为NoGateway,客户端可以使用和处置这样的类:
using(NoGateway objNoGateway = new NoGateway()) { // Do stuff here }
当执行到达using块的末尾时,会自动调用Dispose方法,还是客户端必须手动调用dispose方法?即
NoGateway objNoGateway = new NoGateway(); // Do stuff with object objNoGateway.Dispose(); // finished with it
我使用的是
WebClient
在我的班级NoGateway
课。因为WebClient
实现IDisposable
接口,这是否意味着WebClient
间接使用非托管资源?有严格的规则可以遵循吗?我怎么知道一个类使用非托管资源?