將不確定變為確定 程式是否真的Dispose了

2021-09-22 13:15:57 字數 1376 閱讀 1554

首先將來說一下dispose是什麼東西吧,對於我們使用非託管的資源時,需要自己去實現dispose這個方法,它的含義就是釋放使用的記憶體空間。

例如stream這個型別,它就是乙個非託管型別,它會實現乙個idisposable介面,來實現dispose方法

像transactionscope,.net事務,它也是乙個非託管的,也就是說,我們在使用完事務後,需要自己去進行dispose()操作,下面問題就來了,這個dispose寫在**合適呢?

注意看這段**:

using (transactionscope trans = new 

transactionscope())

);new

webaccountbalancesrepository().update(new

webaccountbalances );

}catch (exception e)

finally

}

這是非常標準的寫到,完成乙個訂單處理的過程,它將處理訂單,**支付明細及**總餘額寫在了乙個事務裡,這當然是沒有問題的,注意看dispose的位置,寫在了finally{}裡,這也是對的,當try{}完成後,將會執行finally片斷,但注意catch{}段,它進行所有異常的捕捉,並進行丟擲,好了,如果這個try{}段出現了異常,那finally{}段是否會執行嗎?也就是dispose是否會被執行呢?

經過我的測試,它有執行,但由於你使用了throw,所以網頁直接黃屏了,所以,最好把catch段進行處理,你可以去把異常寫到日誌裡,但有一點要注意,finally{}塊裡不要寫可能會出現異常的**,否則,會使你的事務資源永遠得到不釋放!

例如:

using (transactionscope trans = new 

transactionscope())

);new

webaccountbalancesrepository().update(new

webaccountbalances );

}catch (exception e)

finally

}

當然,這一般是由於程式設計習慣引起的,大家以後注意就行了,在finally裡釋放資源時,應該考慮異常進行一些必要的判斷。

如果非要寫在finally裡,如果你的物件不能確定是否會發生異常,那就try,catch吧,看**:

finally

catch (exception e)

finally }

這樣,trans.dispose()也是會被執行的,也就是說,對於同乙個try,catch,finally來說,finally是永遠都會被執行的。

將不確定變為確定系列 Linq的批量操作靠的住嗎?

回到目錄 無論是linq to sql還是linq to object entity frameworks 它們都為開發人員提供了insert操作,及insert集合操作,即insertonsubmit和insertallonsubmit,前者是將乙個實體標記為乙個插入狀態,而後都是將乙個集合標記為...

將不確定變成確定 類中的override

說到override大家都知道,它是複寫,子類去複寫父類的方法與屬性,是,沒錯,今天主要就說這個複寫,如果不複寫會有什麼結果,有沒有想過,呵呵 來和我做個demo吧 1 abstract class parent24 567 class sub parent8 1011 在另外乙個類中為sub這個屬...

使用union型別出現的程式結果不確定問題

剛從論壇上看到乙個問題 include int main void r r.i 0 0 r.i 1 2 printf d n r.k 沒有賦值所以值是不確定的 return 0 程式結果是什麼?這裡簡單解釋一下 由於union型別是共享記憶體,也就是說字元陣列i和int型別變數k共享這一記憶體的資料...