我一直在研究一些代码。我有一个问题:
这两个代码有什么区别?
using (FORM formExemple = new FORM ())
{
formExemple.ShowDialog();
}
和
FORM formExemple = new FORM ();
formExemple.ShowDialog();
我一直在研究一些代码。我有一个问题:
这两个代码有什么区别?
using (FORM formExemple = new FORM ())
{
formExemple.ShowDialog();
}
和
FORM formExemple = new FORM ();
formExemple.ShowDialog();
using
完成后调用对象的Dispose()
方法进行清理。它通常处理诸如关闭打开的连接和/或释放内存之类的事情。如果您以其他方式实例化它,则必须手动执行此操作。您只能using
在实现该IDisposable
接口的对象上使用,这可以确保Dispose()
该对象存在方法。
using 块用于自动处理实现IDisposable
. 第一个Dispose()
在块的末尾被调用。using 块还将确保在发生异常时正确处理对象。
当开发人员确定他们不再需要该对象时,第二个不需要并且需要由开发人员处理。
与以往一样,请查阅文档 -语句的MSDN C# 指南using
或 C# 规范(它是 C# 5 规范中的第 8.13 节)。
该using
语句只能与实现的类型一起使用IDisposable
,并且它基本上确保在初始表达式(资源获取表达式)中出现的任何资源都被放置在块的末尾,即使抛出异常也是如此。您的第一个代码片段大致相当于:
FORM formExemple = new FORM(); // I hope you don't *really* use these names
try
{
formExemple.ShowDialog();
}
finally
{
formExemple.Dispose();
}
请注意,除此之外还有更多内容:
using
语句本身using
它处理语句中变量的变化(原始值仍然被释放)基本上,它可以更轻松地清理需要及时处理的资源——网络流、文件句柄、数据库连接、图形对象等。
using
是您可以与已实现 IDisposable 接口的对象一起使用的东西。使用 using 的原因是一旦你完成了你的表单,你不必担心任何清理工作,Form 上的 Dispose 方法将被调用,一切都会被清理。
在您的第二个示例中,从未调用 Dispose 并且对象仍在内存中,并且如果垃圾收集器无法识别它需要清理它,则可能会存在一段时间。
使用语句...
using (Font font1 = new Font("Arial", 10.0f))
{
byte charset = font1.GdiCharSet;
}
... 是以下模式的语法快捷方式(语法糖):
{
Font font1 = new Font("Arial", 10.0f);
try
{
byte charset = font1.GdiCharSet;
}
finally
{
if (font1 != null)
((IDisposable)font1).Dispose();
}
}
(我从上面的链接中获取了示例)
...因此,您的两个代码片段之间的区别是try
+ 对 -block 的IDisposable.Dispose()
调用finally
。
using 语句定义了 formExemple 的范围,一旦超出 using 语句的控制,为 formExemple 分配的内存将被释放。