当前位置:  开发笔记 > 编程语言 > 正文

什么是C#Using块,我为什么要使用它?

如何解决《什么是C#Using块,我为什么要使用它?》经验,为你挑选了7个好方法。

在C#中使用块的目的是什么?它与局部变量有什么不同?



1> plinth..:

如果类型实现了IDisposable,它会自动处理它.

鉴于:

public class SomeDisposableType : IDisposable
{
   ...implmentation details...
}

这些是等价的:

SomeDisposableType t = new SomeDisposableType();
try {
    OperateOnType(t);
}
finally {
    if (t != null) {
        ((IDisposable)t).Dispose();
    }
}

using (SomeDisposableType u = new SomeDisposableType()) {
    OperateOnType(u);
}

第二个更容易阅读和维护.


请注意,通常finally块将在调用Dispose之前检查是否为null.当你打电话给构造函数时并不重要,但......
如果在using块之外声明变量,然后在using语句中创建一个新实例,则它可能不会处置该项.
**注意:**注意使用带有`HttpClient()`的`using`块!见[本文](https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/).
因此,一旦上下文完成,using语句将自动处理对象,那么我们应该在实现IDisposable的类型上使用using语句吗?哪些类型必须实现该接口,是否有任何经验法则或我是否必须单独检查每种类型?
作为一个迂腐的人,你需要在第二个代码块周围使用花括号来反映有限的范围.

2> Sam..:

UsingDispose()using-block被保留之后调用,即使代码抛出异常.

所以你通常using用于需要在它们之后进行清理的类,比如IO.

所以,这个使用块:

using (MyClass mine = new MyClass())
{
  mine.Action();
}

会做同样的事情:

MyClass mine = new MyClass();
try
{
  mine.Action();
}
finally
{
  if (mine != null)
    mine.Dispose();
}

使用using更简短,更容易阅读.



3> Robert S...:

来自MSDN:

C#通过.NET Framework公共语言运行库(CLR)自动释放用于存储不再需要的对象的内存.记忆的释放是不确定的; 只要CLR决定执行垃圾收集,就会释放内存.但是,通常最好尽快释放文件句柄和网络连接等有限资源.

using语句允许程序员指定何时使用资源的对象应该释放它们.提供给using语句的对象必须实现IDisposable接口.此接口提供Dispose方法,该方法应释放对象的资源.

换句话说,该using语句告诉.NET在using不再需要块时释放块中指定的对象.


@raven:仅供参考,这不是&符,这是:&:)

4> 小智..:

using语句用于处理实现IDisposable接口的C#中的对象.

IDisposable接口有一个名为的公共方法Dispose,用于处理该对象.当我们使用using语句时,我们不需要在代码中显式地处理对象,using语句会处理它.

using (SqlConnection conn = new SqlConnection())
{

}

当我们使用上面的块时,内部代码生成如下:

SqlConnection conn = new SqlConnection() 
try
{

}
finally
{
    // calls the dispose method of the conn object
}

有关更多详细信息,请阅读:了解C#中的"using"语句.



5> 小智..:

另请注意,实例化的对象using在using块中是只读的.请参阅此处的官方C#参考.



6> Bert Huijben..:
using (B a = new B())
{
   DoSomethingWith(a);
}

相当于

B a = new B();
try
{
  DoSomethingWith(a);
}
finally
{
   ((IDisposable)a).Dispose();
}


这个答案包含一个错字.(这就是为什么我们应该首先命名我们的课程的另一个例子.)请参阅这篇文章中的[其他答案](http://stackoverflow.com/a/212204/728675).

7> TheSmurf..:

将代码放置在使用块中可确保在控件离开块时立即处理对象(但不一定要收集).

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有