3 回答
TA贡献2036条经验 获得超8个赞
完成某些对象后,需要采取一些措施。通常这是因为对象使用某种需要处置的资源。例如,如果您具有文件类File的文件对象,并且该对象从文件系统中打开文件,则需要再次关闭文件系统中的文件。
如果您只是离开了文件对象,而忘记了调用file.Close(),则直到垃圾回收器(GC)运行并且没有使用任何文件对象时,它才会被清除。垃圾收集器的运行时间应由公共语言运行时(CLR)决定。如果在处理完文件后GC仍未运行很长时间,则文件可能会保持打开状态很长时间。如果有许多文件对象,或者如果某人想要打开文件,这可能会带来很大的问题,但不能这样做,因为留下的文件对象仍然在闲逛。
为了解决此问题,C#具有IDisposable接口。这有一种称为“处置”的方法。需要一些清理的类实现了此Dispose方法。这为您提供了一种清理使用资源的对象的标准方法。有很多类需要调用Dispose。这样做的问题是代码包含了对Dispose的调用,并且遵循它们很棘手,因为您新建对象并调用Dispose进行清理的位置不同。因此,您必须仔细检查代码,并非常小心地检查是否在正确的位置调用了Dispose。
为了解决此问题,C#引入了“ using”关键字。您可以在新对象的周围放置“ using”关键字,这样可以确保为您调用Dispose。它保证无论发生什么情况都将调用Dispose ...即使在using语句的主体中引发了异常。
因此,当您要确保将清除分配资源的对象时,应使用“使用”。
using仅可用于在堆栈上即函数中声明的对象。它对于声明为类成员的对象不起作用。对于他们,您必须致电Dispose。您可能必须在您的类中实现Dispose,以便in可以在其需要它的任何成员对象上调用Dispose。
需要使用调用的常见对象有:文件,数据库连接,图形对象(如笔和画笔)。
当您希望两个操作同时发生时,有时也会使用它。例如,如果您想在输入代码块并退出代码时编写一条日志语句,则可以编写一个可以使用的日志类,如下所示:
using( Log log = new Log("Doing stuff") )
{
// Stuff
}
可以使log类的构造函数写出消息,而Dispose方法也可以写出消息。实现终结器(〜Log)以断言是否未调用Dispose方法,以确保在“新Log”周围记住“ using”。
TA贡献1842条经验 获得超21个赞
我看到很多其他的答案时表示你应该有一个using
说法。我想解决的时候,特意应该不会有一个using
说法:
如果需要在当前函数范围之外使用对象,则不要使用using
块。一个很好的例子是返回数据库连接的工厂方法或需要返回数据读取器的方法。在任何一种情况下,如果使用using
语句创建对象,则该对象将在返回方法之前被处理,因此无法在方法外部使用。
现在,您仍然要确保已处置这些对象,因此您仍可能需要在using
某处声明。只是不要在实际创建对象的方法中包括它。相反,您可以将函数调用本身包装在一条using
语句中。
- 3 回答
- 0 关注
- 438 浏览
添加回答
举报