为什么这些物品没有被处理掉

why these objects are not getting disposed

我的理解是,如果在 foreach 循环中调用实现 IDisposable 模式的对象,它会自动处理,无需在显式使用或调用 Dispose 方法中使用它。我有以下代码

class Program
{
    static void Main(string[] args)
    {
        using (Employee e = new Employee() { Name = "John" }) ;
        {

        }

        foreach (var e in GetEmployees())
            Console.WriteLine(e.Name);
    }

    static List<Employee> GetEmployees()
    {
        Employee emp = new Employee() { Name = "Peter" };
        Employee emp2 = new Employee() { Name = "Smith" };
        List<Employee> emps = new List<Employee>();
        emps.Add(emp);
        emps.Add(emp2);
        return emps;
    }
}

class Employee : IDisposable
{
    public string Name { get; set; }

    public void Dispose()
    {
        Console.WriteLine("disposing " + Name);
    }
}

我没有看到为 GetEmployees 方法返回的对象调用了 Dispose。这是否意味着我需要在 foreach 循环中调用 Dispose

您必须手动调用 Dispose(),或使用 using() 语句

foreach 不调用 Dispose 方法,只有 using 调用。 using 指令只是一个糖:

try {
    // Initialize
}
finally {
    // Dispose
}

是的,你必须自己编写 Dispose 调用,如下所示:

foreach (var e in GetEmployees())
{
    Console.WriteLine(e.Name);
    e.Dispose();
}

foreach (var e in GetEmployees())
{
    using (e)
    {
        Console.WriteLine(e.Name);
    }
}

考虑来自 MSDN 的 Dispose Pattern 以更好地理解 Disposing 在 .NET 中的工作方式:

简单用例:

public class DisposableResourceHolder : IDisposable {

    private SafeHandle resource; // handle to a resource

    public DisposableResourceHolder(){
        this.resource = ... // allocates the resource
    }

    public void Dispose(){
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing){
        if (disposing){
            if (resource!= null) resource.Dispose();
        }
    }
}

具有可终结类型的复杂用例:

public class ComplexResourceHolder : IDisposable {

    private IntPtr buffer; // unmanaged memory buffer
    private SafeHandle resource; // disposable handle to a resource

    public ComplexResourceHolder(){
        this.buffer = ... // allocates memory
        this.resource = ... // allocates the resource
    }

    protected virtual void Dispose(bool disposing){
            ReleaseBuffer(buffer); // release unmanaged memory
        if (disposing){ // release other disposable objects
            if (resource!= null) resource.Dispose();
        }
    }

    ~ ComplexResourceHolder(){
        Dispose(false);
    }

    public void Dispose(){
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}

更新:如注释中所述,我认为您混淆了 Garbage Collection and DisposingDisposing 用于释放应用程序中 .NET Framework 之外的非托管资源。 Garbage Collection 是自动完成的,在您完全理解为什么需要它之前,您不应该强迫它。