c#中Using块的目的是什么?它和局部变量有什么不同?
当前回答
它实际上只是一些语法糖,不需要对实现IDisposable的成员显式调用Dispose。
其他回答
在using块中放置代码可以确保一旦控件离开块,对象就会被处理(尽管不一定会被收集)。
它实际上只是一些语法糖,不需要对实现IDisposable的成员显式调用Dispose。
在Using块离开后使用Dispose(),即使代码抛出异常。
因此,您通常将using用于需要在它们之后清理的类,例如IO。
所以,这个使用block:
using (MyClass mine = new MyClass())
{
mine.Action();
}
会做同样的事情:
MyClass mine = new MyClass();
try
{
mine.Action();
}
finally
{
if (mine != null)
mine.Dispose();
}
使用“使用”更简短,更容易阅读。
如果该类型实现了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);
}
第二种更容易阅读和维护。
自从c# 8以来,有了一个新的语法,可以使代码更具可读性:
using var x = new SomeDisposableType();
它没有自己的{}块,使用范围是从声明点到声明它的块的末尾。这意味着你可以避免这样的事情:
string x = null;
using(var someReader = ...)
{
x = someReader.Read();
}
还有这个:
using var someReader = ...;
string x = someReader.Read();
using (B a = new B())
{
DoSomethingWith(a);
}
等于
B a = new B();
try
{
DoSomethingWith(a);
}
finally
{
((IDisposable)a).Dispose();
}
推荐文章
- 虚拟方法和抽象方法的区别
- i++和++i的区别是什么?
- 可空对象必须有一个值
- 按类型查找WPF窗口中的所有控件
- 为什么我不能继承静态类?
- 数组与列表的性能
- 如何在c#中获取CPU的使用情况?
- BindingFlags。IgnoreCase不为Type.GetProperty()工作?
- 使用私有静态方法的优点
- 一个任务被取消了?
- 新DateTime()与默认值(DateTime)
- 从Description属性中获取Enum
- JavaScript错误(Uncaught SyntaxError:意外的输入结束)
- 在Bash中测试非零长度字符串:[-n "$var"]或["$var"]
- 从包含文件名的路径获取不包含文件名的完整路径