簡體   English   中英

如何處理通過其Next屬性迭代的對象?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM