2010-08-31 166 views
2

請參閱我的示例代碼:如何檢測對象是否在「使用」範圍內?

var testObject = new SomeClass(); 
using (testObject) 
{ 
    //At this point how can the testObject implicitly know 
    //if it is placed inside a 'using' scope? 

    // In other words, how can testObject know that 
    // .SomeAction() is being called from within a 'using' scope? 

    testObject.someAction(); 
} 
+6

你不能,你不應該。 ** using **語句是try/finally的語法糖,它手動調用Dispose()方法。兩者都是完全有效的用例,因此你的方法顯式檢查using語句是不恰當的(即使它可以 - 它不能)。 – 2010-08-31 21:18:36

+0

爲什麼testObject應該知道它在「使用範圍」中?只有編譯器必須知道在離開示波器時調用dispose。 – 2010-08-31 21:19:17

+1

這裏真正的問題是「爲什麼」你爲什麼想知道它是否在使用範圍內?如果它應該在使用範圍內,請圍繞它創建一個包裝類。 – McKay 2010-08-31 21:22:26

回答

5

這不可能。

它可以通過堆棧轉儲來確定調用代碼的位置,並分析代碼以確定它的功能。它可能會尋找using塊生成的try...finalydispose,但它仍不能確定它是否實際上是否爲using塊。

0

你不能。它無論如何不會有任何分別。你所做的只是創建對象,調用一些方法,然後處理它。爲什麼someAction的行爲會根據是否在將來某個時候調用Dispose而發生變化?

0

我想構造一個對象, 只能如果 它被放置在「使用」範圍之內,它被稱爲方法。

不,這是不可能的。

你爲什麼想要想要這樣的功能的唯一原因是保證一個對象總是在離開作用域時被丟棄,並且有更好的方法來執行這個邏輯。

如果您使用VS2010,則可以使用FxCop的Dispose objects before losing scope作爲實現IDisposable的對象。如果你創建一個對象而不處理它,FxCop會讓你的構建失敗 - 這與編譯器保證一樣好,因爲你可以滿足你的需求。

+0

另一個選擇是添加一個終結器,如果該對象尚未處置,則拋出該終結器。我爲調試版本中的某些對象執行此操作。 – 2010-08-31 22:01:32

+0

對不起@Juliet,但你不能認爲這是我想要這樣的功能的唯一原因。我只想知道它是否可能,是不是真的在爲什麼要求建議。 – 7wp 2010-08-31 22:08:43