我一直在研究一些代码。我有一个问题:使用“using”的实例化与简单实例化有什么区别
这两个代码有什么区别?
using (FORM formExemple = new FORM())
{
formExemple.ShowDialog();
}
和
FORM formExemple = new FORM();
formExemple.ShowDialog();
我一直在研究一些代码。我有一个问题:使用“using”的实例化与简单实例化有什么区别
这两个代码有什么区别?
using (FORM formExemple = new FORM())
{
formExemple.ShowDialog();
}
和
FORM formExemple = new FORM();
formExemple.ShowDialog();
using
调用对象的方法在完成后自行清理。它通常处理诸如关闭打开的连接和/或释放内存之类的事情。如果您实例化它,否则您必须手动执行此操作。对于实现IDisposable
接口的对象,只能使用using
,这可确保该对象存在方法Dispose()
。
正确。请记住Dispose()没有什么不可思议的。您可以从IDisposable继承,并创建Dispose()方法,但除非实际手动编写代码,否则实际上只是调用一个空方法。关于使用它的好处是它确实调用了dispose(),并且它限制了范围。 –
@RyanTernier我几乎放了一个免责声明,“Dispose'并不是魔术,但我决定反对它,因为我认为最后一句暗示'Dispose()'只是接口的一部分 –
的使用块用于自动处理实现IDisposable
的一个对象。 第一个得到Dispose()
在块的末尾被调用。在例外情况下,使用块还将确保对象正确处置。
第二个不需要开发人员处理时,他们确定他们不再需要该对象。
和往常一样,请查阅文档 - MSDN C# guide for using
statements或C#规范(C#5规范中的第8.13节)。
的using
语句只能与两类实施IDisposable
被使用,并且它基本上可以确保任何资源在inital表达式出现(在资源获取表达)设置在块的末尾,即使一个异常被抛出。你的第一个代码段是大致等同于:
FORM formExemple = new FORM(); // I hope you don't *really* use these names
try
{
formExemple.ShowDialog();
}
finally
{
formExemple.Dispose();
}
还有比这更给它一点点,你要知道:
using
声明本身using
语句中更改变量(原值仍然迪sposed)基本上,这使得它更容易清理需要及时处置资源 - 网络流,文件处理,数据库连接,图形对象等
using语句定义formExemple范围,分配给formExemple的内存将在using语句的控制之外被释放一次。
using
是您可以与实现IDisposable接口的对象一起使用的东西。使用使用的理由是一旦你完成了你的表单,你不必担心任何清理,表单上的Dispose方法将被调用,并且所有内容都将被清除。
在你的第二个例子,处置,不会被调用的对象仍然在内存中,可能是一段时间,如果垃圾收集器无法识别,它需要把它清理干净。
的using-statement ...
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();
}
}
(I接过的例子从上面的链接)
...因此您的两个代码片段try
+拨打IDisposable.Dispose()
finally
-block。
@AnthonyFG同意后超出范围。感谢您的编辑! – ulrichb
请不要打电话给你的'FORM'类型。 1)不要在变量/类型名称中使用所有大写字母2)给它一个更有意义的名称。 – Servy