C# 使用(…){…}意味着什么
可能的重复项:C# 使用(…){…}意味着什么,c#,idisposable,using,using-statement,C#,Idisposable,Using,Using Statement,可能的重复项: 只是想知道这意味着什么?我在网上看到了很多教程,其中包含以下语法: using (SqlCeCommand cmd2 = new SqlCeCommand("SELECT city FROM cities JOIN states ON states.id=cities.state WHERE states.state='" + read.GetString(0) + "'", con)) { SqlCeDataReader readCities = cmd2.Execut
只是想知道这意味着什么?我在网上看到了很多教程,其中包含以下语法:
using (SqlCeCommand cmd2 = new SqlCeCommand("SELECT city FROM cities JOIN states ON states.id=cities.state WHERE states.state='" + read.GetString(0) + "'", con))
{
SqlCeDataReader readCities = cmd2.ExecuteReader();
while (readCities.Read())
{
parent.Nodes.Add(readCities.GetString(0));
}
}
为什么要用它?我尝试搜索Google,但它找到了用于包含dll和其他文件的“using”关键字。using只是指示编译器编写代码,对正在使用的变量调用
Dispose
方法。只有实现“IDisposable”的类型才能与using
语句一起使用
在您的示例中,当{}中的代码完成时,cmd2将被释放。定义一个作用域,一个或多个对象将在该作用域之外被释放“请参见
使用应用于实现IDisposable的对象。它确保在离开using
块时(无论是正常还是通过异常或其他方式),调用一次性对象的Dispose
方法。using
语句
using(var disposableObject = new object_that_implements_IDisposable()) { ... }
代码的语法糖类似于以下内容:
var disposableObject = new object_that_implements_IDisposable()
try
{
...
}
finally
{
if(disposableObject != null)
{
((IDisposable)your_object).Dispose();
}
}
这仅适用于实现IDisposable的类。它有助于清理代码,因为在您为系统的其余部分释放资源后,需要清理对象,例如系统资源(文件句柄、数据库连接、套接字等)
理论上,您可以省略.Dispose()
调用,但随后必须等待垃圾收集器释放保留的资源。GC在知道何时释放对象以回收其内存使用方面非常出色,但它不知道需要释放对象以使其放弃其他系统资源。因此,在GC决定需要所有者使用的内存之前,可能不会放弃这些关键资源。因此,当你处理完物品(如果是一次性的)时,你一定要把它们处理掉
至于你为什么要使用而不是尝试/最后
,这完全是程序员的偏好。我更喜欢使用,因为您可以级联它们:
using(var a = new class())
using(var b = new class())
using(var c = new class())
using(var d = new class())
{
...
}
您需要更多的代码行才能使用尝试/最后
使用
还有其他优点。例如,如果x
为null,则直接调用x.Dispose
可能会引发NullReferenceException
,而使用(x)
则不会
另见:
Using语句定义了一个作用域,在该作用域之外将处理一个或多个对象。Using是清理资源的一种很酷的方法,它相当于尝试{}捕获{}最后{处理}。有效c#在这方面有一个项目,我打赌你会得到10+个类似的答案
using
语句定义了使用实现IDisposable接口的对象的范围。一旦块退出,对象将被清除。见:
请参见
using语句将其中的变量封装在一个范围内。当执行退出using块时,其中的所有对象都将从内存中释放。您可能会在DB连接中看到它,这样当using块退出时,分配给该连接的资源将被清理并关闭。请参阅C#规范的第8.13节。请参阅以下答案:您也可以在此处尝试快速搜索,你会发现你创造了一个重复的问题。扎诺:这可能对他没有多大帮助,这取决于他是否知道自己在寻找什么。在C#中,“using”关键字有两种完全不同的含义。我怀疑大多数开发人员是否意识到C#规范的存在。关键是“您必须等待垃圾收集器释放保留的资源。”+1离开using块时,将调用IDisposable.Dispose。如果还显式定义了IDisposable.Dispose,则这可能不同于对象定义的Dispose方法。感谢您在重试之前编辑、修复、放置声明和初始化变量。删除了我指出该漏洞的注释。+1不知道级联语法技巧。始终是实现IDisposable
的一个。好的,我理解,但为什么它的措辞是这样的?在我看来,使用
并不意味着嘿,编译器,请跟我来清理一下?