我应该使用哪些类使用C#的using语句?

Cor*_*urn 3 c# using-statement

我已阅读并且我相信我理解C#的using语句是什么(如果我错了请纠正我):将IDisposable对象初始化为只读有限范围(using块).我知道你可以在之前初始化using并且不限制范围,但建议不要这样:

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

我并不总是关注哪些类是什么类的子类.我不太确定哪些类继承自IDisposable.我不只是好奇在一个using语句中可以使用哪些类,但是我的同事希望在一个using块中找到哪些类?块中应该包含哪些类using?另外,没有使用using块而不调用Dispose 有什么问题吗?它只是关于记忆还是稳定?

Ada*_*son 16

严格地说,任何实现的对象IDisposable和其范围仅限于该函数的对象应该在一个using块内.该IDisposable接口的存在允许处理非托管资源(数据库连接,文件句柄,窗口句柄等)的类以及时,确定的方式处理这些资源.

通常,有三种方法在IDisposable一个类中使用对象:

  1. 在单个方法调用的范围内创建并且不再需要该对象.这很常见,是什么时候using可以(也应该)使用.
  2. 该对象由类创建(或传递给类),其生命周期超出了单个方法调用的范围,但不超出类的生命周期.例如,您的类创建了一个Stream并且需要在对象的生命周期中使用它.在这种情况下,您的类应该实现IDisposable自己并在调用自己的Dispose方法时处置您拥有的对象.一个例子就是这样的System.IO.StreamWriter
  3. 该对象被传递给类,但该类不"拥有"它.这意味着IDisposable对象的可用生命周期超出了单个方法调用的范围,并且可能超出了对象的生命周期.在这种情况下,其他人必须负责打电话Dispose.

第一种情况是您将遇到的最常见的情况,这就是using阻止存在的原因.即使在例外的情况下,它也会确保处理对象.

一些例子:

  • 流类
  • 数据库连接/命令
  • 控制

没有详尽的类列表可以实现IDisposable,因为该列表相当大并且填充了您可能永远不会遇到的类.想想班级的作用 ; 它是否打开某种需要关闭的连接或文件?一般来说,它是否获得了某种需要发布的资源?如果是这样,它可能会实现它.在基本级别,如果编译器允许您将其括起来using,那么它实现IDisposable.

至于打电话的后果Dispose,不要考虑它.呼叫处理.确实,防御标准是如果你的类直接使用非托管资源,那么你应该定义一个终结器,如果你的对象被收集并且有人没有调用它就会调用dispose,但这不应该是一个设计选择.永远,据我所知.


Jon*_*eet 13

这不是关于记忆.它涉及其他资源,如文件句柄,数据库连接等.

基本上,如果一个类实现了IDisposable,那就是一个信号,你应该在完成后处理它,因为它可能有非托管资源,而且留下来是很昂贵的.(例如,您的连接池可能会用完连接,或者文件句柄将保持打开状态,从而阻止另一段代码再次打开同一个文件).

  • @masfenix:很快,*没什么特别的*.`IDisposable`只是另一个接口**,它的特殊之处在于有一个特殊的语言元素(`using`块)可以直接解决这个习语.虽然有关于如何实现界面的建议设计模式,但实际上并没有什么特别之处.GC没有直接做任何事情. (3认同)