繁体   English   中英

C#使用Statement和iDisposable

[英]C# Using Statement and iDisposable

我刚刚发现最佳实践指示在任何类型实现iDisposable的地方,然后你应该将它包装在using语句中以确保对象被正确处理,即使在异常情况下也是如此。

我的问题是,你如何轻松地告诉哪些对象实现iDisposable? 或者我应该在using语句中包装我不确定的所有内容,然后依赖编译器在编译时告诉我?

谢谢。

你可以 ...

  • 寻找Dispose成员的存在
  • 看看你的类型的定义(F12)
  • 按照您的建议进行操作,包装使用并查看编译器所说的内容

虽然,最好的方法是了解IDisposable的用途,但很快您就会了解实现此接口的类型。 即外部资源,非托管类型包装器(例如GDI图形对象),有限资源(数据库连接)

你怎么能轻易地告诉哪些对象实现了iDisposable?

以编程方式可以使用。

IDisposable disposable = obj as IDisposable;
if(disposable!=null)
{
 //this object implements IDisposable
}
else
{
 //Not implement IDisposable interface
}

IDisposable例如通过允许访问非托管或昂贵资源的对象来实现,例如文件,数据库连接和类似的东西。 所以在某种程度上,你可以猜到。 对于其余部分,intellisense会告诉您对象上是否有Dispose()方法。

如果它是标准类,那么MSDN文档页面应该说明它是否实现了IDisposable。 第三方库通常也附带文档。 否则,如果您使用的是像Visual Studio这样的IDE,则可以检查类(F12键)并查看它实现的接口。

如果右键单击并选择Goto Declaration,您应该在那里获得对象浏览器,您可以查看该类实现的所有接口。

否则使用intellisense检查类是否有Dispose()方法,在这种情况下使用Using。

最后,如果您尝试在不是IDisposable的东西上使用Using,则会出现编译错误。

使用对象资源管理器,您应该能够遍历层次结构以查看您尝试使用的对象的根。

但是,编译器会警告您,如果您尝试使用的变量不是IDisposable

using (int i = 1)
{
// ...
}

会给你一个错误:

错误1'int':using语句中使用的类型必须可以隐式转换为'System.IDisposable'

你也可以这样检查

if (anyobject is IDisposable)
{
    //it implemants IDisposable
}

如果一个人可以使用“使用”声明并使其工作,通常应该。 需要注意的一种情况是创建一个对象并将其作为某个其他对象的属性传递。 框架可以采用四种方法:

  1. 获取传入的IDisposable的快照。 接收对象将负责处理快照; IDisposable的供应商负责处理它,并且可以在拍摄快照后随时进行。
  2. 拍摄传入的IDisposable的快照,而不管它是否被处置。 供应商负责处理IDisposable,但可以在任何时候合法地进行 - 甚至在传入之前。控件的“字体”属性似乎就是这样。 如果Font对象仅用于设置控件的Font属性,可以在创建字体后立即处理该字体,而不必担心以后清理它。
  3. 接收对象要求传入的对象不是Disposed直到接收对象完成它,接收对象将处理它。
  4. 接收对象要求传入的对象不是Disposed直到接收对象完成它,但发送对象仍然负责处理它。

不幸的是,Microsoft似乎在框架的不同部分使用不同的IDisposable对象方法。 有时,最好的办法是在设置属性后立即处理对象,并查看当接收对象尝试使用它时是否会导致问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM