[英]How to dispose of an object that is iterated through via its Next property?
我有一個使用一些基礎本機資源的對象,並且有一個指向下一個實例的指針,該實例通過以下方式進行迭代:
MyObject begin = null;
try
{
begin = GetFirst();
while (begin != null)
{
MyObject next = begin.Next();
// do something with begin
begin.Dispose();
begin = next;
}
}
finally
{
if (begin != null)
{
begin.Dispose();
}
}
我得到代碼分析問題:
CA2202:Microsoft。用法:對象“ begin”可以在方法“ x()”中處理多次。 為避免生成System.ObjectDisposedException,不應在對象上多次調用Dispose。
知道如何在不抑制的情況下擺脫此錯誤嗎?
在我看來,您的最后一段代碼似乎是不必要的。 如果begin != null
,那么您的while
循環應該繼續了,不是嗎?
更新 :看來您正在嘗試確保在引發異常的情況下,處理為begin
獲得的最后一個值。 嘗試這個:
MyObject begin = GetFirst();
while (begin != null)
{
MyObject next;
using (begin)
{
next = begin.Next();
// do something with begin
}
begin = next;
}
請注意,在以上建議中,實際上仍然可能會遇到一個未處理的對象:在using
塊結束之前,最后一個分配給next
值。 您最初的問題未涉及這種情況,因此在上述建議中我沒有解決。 但是,如果這是一個潛在問題,則需要考慮。
似乎Code Analysis認為在Dispose()
方法期間可能發生異常。 在這種情況下,您將使用一個beginning-alit-non-null null引用進入begin
的finally塊。
請注意,如果您打算在其他錯誤捕獲和處理中包裝對begin.Dispose()
的調用,我將只喜歡begin.Dispose()
。 IMO,丹的解決方案更加優雅。
這是嘗試消除警告的最終方法:
MyObject begin = GetFirst();
MyObject next = null;
while (begin != null)
{
try
{
next = begin.Next();
// do something with begin
}
finally
{
begin.Dispose();
begin = next;
}
}
您顯然有某種機制可以識別鏈中的第一項,也許是其他一些對象或存儲第一項的靜態對象?
在最初調用的代碼中如何處理:
GetFirst().Dispose();
然后,dispose方法的唯一職責是處置當前項目及其子項:
public void Dispose()
{
if (Next() != null)
{
Next().Dispose();
}
}
這消除了在dispose方法中循環的任何需要。 我還將看一看處置模式
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.