在Using块中添加List

时间:2013-11-26 17:05:42

标签: c# collections dispose idisposable using

我有一个像这样实现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”属性都为null。

我明白,因为每个使用执行Dispose()并且在dispose中,我将这两个列表归零,它们将为null。

我的问题是如何实现这一目标而不必在我的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);

- 更新#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();

1 个答案:

答案 0 :(得分:0)

您不希望调用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>个对象。