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