为什么这些物品没有被处理掉
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 Disposing
。 Disposing
用于释放应用程序中 .NET Framework 之外的非托管资源。 Garbage Collection
是自动完成的,在您完全理解为什么需要它之前,您不应该强迫它。
我的理解是,如果在 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 Disposing
。 Disposing
用于释放应用程序中 .NET Framework 之外的非托管资源。 Garbage Collection
是自动完成的,在您完全理解为什么需要它之前,您不应该强迫它。