C#中的双内存分配。坏?

时间:2014-04-02 14:07:34

标签: c# memory garbage

假设我有下一堂课:

class MyClass
{
   public string Id {get; set;}
   public List<string> Data = new List<string>();
}

我需要以下一种方式填写MyClass个实例列表;

// member
private List<MyClass> m_instances = new List<MyClass>();

// some function

public void MyFunc()
{
    MyClass instance = new MyClass();

    for (/* something */)
    {
        instance.Id = "id1";
        instance.Data.Add("data1");

        if (/* something */)
        {
            m_instances.Add(instance);
            instance = new MyClass(); // (!!!!)to clear data
        }
    }
}

GC会以正确的方式处理吗?

P.S。我无法手动释放属性,因为有很多属性...

3 个答案:

答案 0 :(得分:4)

将对象实例化移动到循环顶部的循环中要简单得多:

for (/* something */)
{
    MyClass instance = new MyClass();
    instance.Id = "id1";
    instance.Data.Add("data1");

    if (/* something */)
    {
        m_instances.Add(instance);
    }
}

答案 1 :(得分:2)

您可以,但不会清除List中的实例。它只会创建MyClass的新实例,并分配到instance

您必须将实例本身设置为不同的值,如下所示:

m_instances[index] = new MyClass();

或者

m_instances[m_instances.IndexOf(instance)] = new MyClass();

答案 2 :(得分:2)

instance = new MyClass(); // (!!!!)to clear data - 它没有清除数据,它正在构建一个新对象。只需将MyClass instance = new MyClass();放入循环中即可。即使你以正确的方式做到这一点

MyClass instance;
for (/* something */)
{
    if(something)
    {
        instance = new MyClass();
        instance.Id = "id1";
        instance.Data.Add("data1");
        m_instances.Add(instance);
    }
}

然后就没关系了,因为编译器会生成相同的代码,就像在循环中创建和初始化对象一样。