我创建了一个IDisposable
类对象,我将其存储在List<T>
中。我在函数/过程中向List<T>
添加了对象。但是,如果我使用Using{}
表示法,列表中的对象也会在列表中显示“已处置”。
List<MyObject> MyList = new List<MyObject>;
private void AddObjects()
{
using (MyObject Mo = New MyObject())
{
Mo.Name = "MyName";
Mo.Age = 30;
MyList.Add(Mo);
}
}
在这种情况下,列表中的对象元素是无效的。然而,如果我使用代码:
List<MyObject> MyList = new List<MyObject>;
private void AddObjects()
{
MyObject Mo = New MyObject()
Mo.Name = "MyName";
Mo.Age = 30;
MyList.Add(Mo);
}
然后一切都很好,列表中的对象元素都没问题。
问题:为什么?当函数完成时,MyObject会丢失范围,但对对象的引用仍然存在。
然后是以下代码:
List<MyObject> MyList = new List<MyObject>;
private void AddObjects()
{
for (int i = 1; i < 99; i++)
{
MyObject Mo = New MyObject()
Mo.Name = "MyName";
Mo.Age = 30 + ctr;
MyList.Add(Mo);
}
}
这里MyObject被新对象覆盖,但旧对象仍然存在 - 为什么以前的引用不会被新对象覆盖?
答案 0 :(得分:4)
快速回答:
创建新对象的Using
语句将自动处理using语句末尾的对象。这是Using
的目的,自动处理事物以防止需要手动清理。 (MSDN链接:https://msdn.microsoft.com/en-us/library/yh598w02.aspx)
问题2: 使用下面的代码,一切都很好,列表中的对象元素都可以。
为什么呢?当函数完成时,MyObject会丢失范围,但对对象的引用仍然存在。
List<MyObject> MyList = new List<MyObject>;
private void AddObjects()
{
MyObject Mo = New MyObject()
Mo.Name = "MyName";
Mo.Age = 30;
MyList.Add(Mo);
}
<强>答案:强>
您的对象现在已超出范围,但MyList
变量仍保留对存储在Mo
变量中的对象的引用。
问题3: 然后是以下代码:
List<MyObject> MyList = new List<MyObject>;
private void AddObjects()
{
for (int i = 1; i < 99; i++)
{
MyObject Mo = New MyObject()
Mo.Name = "MyName";
Mo.Age = 30 + ctr;
MyList.Add(Mo);
}
}
这里MyObject被新对象覆盖,但旧对象仍然存在 - 为什么以前的引用不会被新对象覆盖?
回答3:
在每个循环中,您将创建一个名为Mo
的新变量。这样每次都会创建一个新的地址空间和一个新对象。
主要答案 如果你想把它们留在身边,请不要丢弃它们。当你想要它们消失时处理它们。