我有一个类,这个类有"value"变量包含从文件中读取的大数据:
public class MyClass : IDisposable
{
public string name {get; set;}
public string value {get; set;} //I'm load huge data for this variable
public MyClass(string name, string value)
{
this.name = name;
this.value = value;
}
public void Execute()
{
Console.WriteLine(this.name + ":" + this.value);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
this.name = null;
this.value = null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在列表中使用这个类是全局变量
List<MyClass> listQ = new List<MyClass>() { new MyClass("1", "BIGDATA1"),
new MyClass("2", "BIGDATA2"),
new MyClass("3", "BIGDATA3"),
new MyClass("4", "BIGDATA4"),
new MyClass("5", "BIGDATA5"),
new MyClass("6", "BIGDATA6"),
};
private void FUC_Load(object sender, EventArgs e)
{
foreach (MyClass m in listQ)
{
m.Execute();
m.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
所以我想问,如果我这样做,会有任何问题吗?我的对象是否会被处理?有什么最好的方法吗?谢谢!
这是一个不当使用Dispose().
Dispose() 适用于两种情况:
IDisposable.您应该将Dispose()方法重命名Clear()为更好地描述正在发生的事情.
或者(我认为在你的情况下可能更好)你可以简单地设置一旦你迭代它的listQ引用null.由于您在迭代它时会破坏它所拥有的数据,因此很明显您之后不需要数据.
如果将listQ引用设置为null,则其所有内存(包括它所引用的所有对象的内存)将(最终)被垃圾收集,假设没有其他内容保存对这些对象的引用.
请注意,您必须确保所有引用listQ都设置为null.(当它们被声明为返回方法时,对堆栈的引用将自动消失,因此您不必担心这些.)