Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用(…){…}意味着什么_C#_Idisposable_Using_Using Statement - Fatal编程技术网

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
的一个。好的,我理解,但为什么它的措辞是这样的?在我看来,
使用
并不意味着
嘿,编译器,请跟我来清理一下?