在没有资源的类上实现IDisposable有什么好处吗?

Tra*_*s J 59 c# idisposable

在C#中,如果某个类(如经理类)没有资源,那么拥有它有什么好处: IDisposable吗?

简单的例子:

public interface IBoxManager
{
 int addBox(Box b);
}

public class BoxManager : IBoxManager
{
 public int addBox(Box b)
 {
  using(dataContext db = new dataContext()){
   db.Boxes.add(b);
   db.SaveChanges();
  }
  return b.id;
 }
}
Run Code Online (Sandbox Code Playgroud)

使用BoxManager时,如果它还实现了IDisposable,那么内存使用会有什么好处吗? public class BoxManager : IBoxManager , IDisposable

例如:

BoxManager bm = new BoxManager();
bm.add(myBox);
bm.dispose();//is there benefit to doing this?
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 72

IDisposable类型上实现只有两个原因

  • 该类型包含必须在不再使用该类型时释放的本机资源
  • 该类型包含类型的字段 IDisposable

如果这些都不是真的那么就不要实施 IDisposable

编辑

有几个人提到这IDisposable是实现开始/结束或预订操作的好方法.虽然这不是它的原始意图IDisposable确实提供了一个非常好的模式.

class Operation {
  class Helper : IDisposable {
    internal Operation Operation;
    public void Dispose() {
      Operation.EndOperation();
    }
  }
  public IDisposable BeginOperation() {
    ...
    return new Helper() { Operation = this };
  }
  private void EndOperation() {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

注意:实现此模式的另一种有趣方式是使用lambdas.而不是IDisposable回馈用户并希望他们不忘记打电话Dispose给他们一个lambda,他们可以在其中执行操作并关闭操作

public void BeginOperation(Action action) {
  BeginOperationCore();
  try {
    action();
  } finally {
    EndOperation();
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 嗯,实际上还有第三种情况:语法糖.示例:ASP.NET MVC`Html.BeginForm`帮助程序返回`IDisposable`,它在Dispose方法中执行的所有操作都是呈现结束`</ form>`标记. (8认同)
  • 我认为这会使事情过于强烈.有时候你有一个"开始/结束"范例,它完全由`using`结构捕获.例如,Stack exchange自己的MiniProfiler使用这种模式来表示没有资源管理基础的代码"块".MVC框架与HTML元素类似(特别是`<form>`). (7认同)
  • 我讨厌在同一条评论中我不能回应你们两个.很烦人. (5认同)

Teo*_*gul 7

如果您没有明确地使用该Dispose()方法,则一次性和非一次性版本之间不会有任何差异.


And*_*ker 6

虽然您的代码不会从实现IDisposable中受益,但我不同意其他意见,其中声明IDisposable仅用于(直接或间接)释放本机资源.只要对象需要在其生命周期结束时执行清理任务,就可以使用IDisposable.它非常有用using.

一个非常流行的例子:在ASP.NET MVC中Html.BeginForm返回一个IDisposable.在创建时,对象打开标记,当调用Dispose时它会关闭它.没有涉及本地资源,但仍然很好地使用IDisposable.


Dar*_*rov 5

不,如果您没有做一些有用的事情,例如释放您的类可能在Dispose方法中保存的非托管资源,那么将没有任何好处.