程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> C#中Dispose和Close的區別

C#中Dispose和Close的區別

編輯:.NET實例教程

首先,Dispose和Close基本上應該是一樣的。Close是為了那些不熟悉Dispose的開發者設計的。因為基本上所有的developer都知道Close是干嗎的(特別是對於那些有C++背景的developer)。

但是當我們寫code時候,如果要實現Close和Dispose的時候,要注意Close和Dispose的設計模式……net的一些class只提供Close,而且派生自IDisposable,並且隱藏了Dispose方法。是不是覺得很不明白了?

對這些class來說,關鍵在於它們顯式的(explicitly)實現了IDisposable.對於隱式實現來說,你只需要調用"new A()。Dispose()",但是對於顯式實現來說,Dispose不會是這個class的成員函數。唯一的調用方式是你先要cast到 IDisposable才行。(“new A()。Dispose()”編譯不過,但是“((IDisposable)new A())。Dispose()”可以編譯過)。所以這樣就符合了設計的要求:提供Close(),隱藏Dispose(),並且實現了 IDisposable接口。

在。net的framework裡,Close()被設計成public的,並且在Close()裡面call被隱藏的Dispose(); Dispose()去call另一個virtual的Dispose(bool)函數。所以如果你從這個class繼承,你就必須實現Dispose (bool)方法。

調用者call Close()的時候就會call到你重載的那個Dispose(bool)方法去釋放資源。

請參考 http://blogs.msdn.com/brada/archive/2003/07/06/50127.ASPx

注意事項:1,Close()不應該被定義成virtual.對於這個design pattern,Close()只是用來call那個隱藏的Dispose(),用戶不應該改變Close的behavior.對於這個問題, System.IO.Stream也有設計問題。之所以有問題是為了滿足向後兼容的需求。See http://msdn2.microsoft.com/en-us/library/ms227422.ASPx. 文檔裡面提到雖然Close()是virtual的,但是不應該被override.

注,本文譯自我們team manager Richard Wong的精彩講解,貼於此處以期望能夠對大家有所幫助。感謝Richard!

演示代碼如下:

using System;

namespace ConsoleApplication

{

abstract class MyStream : IDisposable

{

public MyStream()

{

m_unmanagedResource = Marshal.AllocCoTaskMem(100);

m_bitmap = new Bitmap(50, 50);

}



#region IDisposable Members

void IDisposable.Dispose()

{

Dispose(true);

GC.SuppressFinalize(this);

}



protected virtual void Dispose(bool isDisposing)

{

if (!m_disposed)

{

if (isDisposing)

{

m_bitmap.Dispose();

}

Marshal.FreeCoTaskMem(m_unmanagedResource);

m_disposed = true;

}

}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved