假设我有下一堂课:
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。我无法手动释放属性,因为有很多属性...
答案 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);
}
}
然后就没关系了,因为编译器会生成相同的代码,就像在循环中创建和初始化对象一样。