C# c中的使用构造是什么#

C# c中的使用构造是什么#,c#,.net,vb.net,using,C#,.net,Vb.net,Using,我看到: using (StreamWriter sw = new StreamWriter("file.txt")) { // d0 w0rk s0n } 我试图查找的所有信息都没有解释它的作用,而是提供了有关名称空间的信息。您想查看的文档(而不是关于名称空间的using指令) 基本上,这意味着将块转换为try/finally块,并在finally块中调用sw.Dispose() 您可以在处理实现IDisposable的类型的任何地方使用using语句,通常您应该将其用于您负责的任

我看到:

using (StreamWriter sw = new StreamWriter("file.txt"))
{
     // d0 w0rk s0n
}

我试图查找的所有信息都没有解释它的作用,而是提供了有关名称空间的信息。

您想查看的文档(而不是关于名称空间的using指令)

基本上,这意味着将块转换为
try
/
finally
块,并在finally块中调用
sw.Dispose()

您可以在处理实现IDisposable的类型的任何地方使用using语句,通常您应该将其用于您负责的任何一次性对象

关于语法,有几个有趣的地方:

  • 您可以在一条语句中获取多个资源:

    using (Stream input = File.OpenRead("input.txt"),
           output = File.OpenWrite("output.txt"))
    {
        // Stuff
    }
    
  • 您不必为变量赋值:

    // For some suitable type returning a lock token etc
    using (padlock.Acquire())
    {
        // Stuff
    }
    
  • 你可以在没有支架的情况下嵌套它们;方便避免压痕

    using (TextReader reader = File.OpenText("input.txt"))
    using (TextWriter writer = File.CreateText("output.txt"))
    {
        // Stuff
    }
    

using构造本质上是一个语法包装器,用于在using中自动调用dispose对象。例如,上面的代码大致翻译成以下内容

StreamWriter sw = new StreamWriter("file.text");
try {
  // do work 
} finally {
  if ( sw != null ) {
    sw.Dispose();
  }
}
给你:


基本上,它会在使用范围结束时自动调用IDisposable接口的Dispose成员。

规范第8.13节回答了您的问题。

检查此项

我为什么要Dispose而不是懒惰?它像uber垃圾收集吗?@Joshua:自己清理-例如,你不想留下打开的文件句柄。@Joshua:作用域定义了最小生存期,而不是最大生存期。这是一种垃圾收集语言;收集器可以在任何时候运行。@Joshua:因为C#没有确定性终结。你是C++开发者吗?非常清楚地说明了本地C++对象生命周期和.NET中的区别,垃圾回收器在收集对象之前可能会等待一段时间。C#3规格:哈哈。我正要否决一个毫无帮助的答案,但后来我注意到了是谁。我想你可以这样回答。@Simon:阅读说明书是无可替代的。当我对该语言有疑问时,我就是这么做的。完全重复:@Hun1Ahpu:请尽量只给出当前对MSDN的引用。我修复了你的链接。