我有一个像这样实现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();
答案 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>
个对象。