C#将Local对象添加到列表<t>然后处置本地对象 - 帮助理解?

时间:2016-05-02 16:57:59

标签: c#

我创建了一个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被新对象覆盖,但旧对象仍然存在 - 为什么以前的引用不会被新对象覆盖?

1 个答案:

答案 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的新变量。这样每次都会创建一个新的地址空间和一个新对象。

主要答案 如果你想把它们留在身边,请不要丢弃它们。当你想要它们消失时处理它们。