簡體   English   中英

在Using塊內添加到列表

[英]Adding to List inside a Using block

我有一個像這樣實現IDisposable的類

  public class SomeClass : IDisposable
{
    private IList<string> _someList = new List<string>();

    public IList<string> SomeList
    {
        get { return _someList; }
    }

    public void Dispose()
    {
        _someList = null;
    }
}

以及使用“ using”塊創建此類的兩個實例並將其添加到此類集合的方法

private static void Main(string[] args)
    {
        IList<SomeClass> classes = new List<SomeClass>();

        using (var sc = new SomeClass())
        {
            sc.SomeList.Add("a");
            classes.Add(sc);
        }

        using (var sc = new SomeClass())
        {
            sc.SomeList.Add("b");
            classes.Add(sc);
        }

        foreach (var a in classes)
        {
            Console.WriteLine(a.SomeList[0]);
        }

        Console.ReadLine();
    }

這里發生的事情是當我來到foreach遍歷“類”中的元素時,兩個對象的“ SomeList”屬性均為空。

我確實了解到,由於每個用法都執行Dispose(),並且在dispose中,我將這兩個列表設為空,因此它們將為空。

我的問題是如何在不停止對dispose()中的“ SomeList”進行空化的情況下實現此目標。

謝謝

-更新1

更接近真實代碼

base.OnPreRender(e);

    Page page = HttpContext.Current.CurrentHandler as Page;
    HtmlHead head = (HtmlHead)page.Header;

    if (Settings.AreSet)
    {
        using (var noIndex = new HtmlMeta())
        {
            noIndex.Name = "somename";
            noIndex.Content = "somecontent";

            head.Controls.AddAt(0, noIndex);
        }
    }

    using (var machineName = new HtmlMeta())
    {
        machineName.Name = "somename2";
        machineName.Content = "somecontent2";

        head.Controls.AddAt(1, machineName);
    }

    UpdateHeader(head);

--UPDATE#2上面類的一種變體,現在具有字符串屬性,而不是列表。

public class SomeClass2 : IDisposable
{
    public string SomeString { get; set; }

    public void Dispose()
    {
        SomeString = string.Empty;
    }
}

對於以下方法,它仍然執行相同的操作。 我的“類”包含“ SomeClass2”的列表,其中“ SomeString”為空(我在dispose()中設置的內容)

IList<SomeClass2> classes = new List<SomeClass2>();

        using (var sc = new SomeClass2())
        {
            sc.SomeString = "a";
            classes.Add(sc);
        }

        using (var sc = new SomeClass2())
        {
            sc.SomeString = "a";
            classes.Add(sc);
        }

        foreach (var a in classes)
        {
            Console.WriteLine(a.SomeString);
        }


        Console.ReadLine();

您不希望致電Dispose嗎? 只是不要使用using語句。

或者using以下命令移動整個邏輯:

private static void Main(string[] args)
{
    IList<SomeClass> classes = new List<SomeClass>();

    using (var sc = new SomeClass())
    {
        sc.SomeList.Add("a");
        classes.Add(sc);

        using (var sc = new SomeClass())
         {
            sc.SomeList.Add("b");
            classes.Add(sc);

            foreach (var a in classes)
            {
                Console.WriteLine(a.SomeList[0]);
            }
        }
    }
    Console.ReadLine();
}

順便說一句:看起來在這種情況下使用IDisposable是沒有意義的。 GC仍將收集未使用的List<T>對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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