C#在列表中使用后处理对象?

Hùn*_*uân 4 c# dispose

我有一个类,这个类有"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)

所以我想问,如果我这样做,会有任何问题吗?我的对象是否会被处理?有什么最好的方法吗?谢谢!

Mat*_*son 9

这是一个不当使用Dispose().

Dispose() 适用于两种情况:

  1. 当您处置非托管资源时.
  2. 当您处置自身实现的类型的对象时IDisposable.

您应该将Dispose()方法重命名Clear()为更好地描述正在发生的事情.

或者(我认为在你的情况下可能更好)你可以简单地设置一旦你迭代它的listQ引用null.由于您在迭代它时会破坏它所拥有的数据,因此很明显您之后不需要数据.

如果将listQ引用设置为null,则其所有内存(包括它所引用的所有对象的内存)将(最终)被垃圾收集,假设没有其他内容保存对这些对象的引用.

请注意,您必须确保所有引用listQ都设置为null.(当它们被声明为返回方法时,对堆栈的引用将自动消失,因此您不必担心这些.)

  • 非常感谢你.你在拯救我的生命 (2认同)