C#中“using”的用途是什么?

356

用户kokos通过提到using关键字回答了精彩的问题《C#的隐藏特性》。你能详细说明一下吗?using有哪些用途?


这是支持RAII习惯的C#方式:http://www.hackcraft.net/raii/ - Nemanja Trifunovic
1
您可以使用已实现IDispose接口的对象。当该对象超出范围时,Using语句将调用Dispose方法。它保证即使发生任何异常也会调用Dispose。它的工作方式类似于finally子句并执行Dispose。 - CharithJ
29个回答

1
< p > using 语句提供了一种方便的机制来正确使用 IDisposable 对象。通常情况下,当您使用 IDisposable 对象时,应该在 using 语句中声明和实例化它。

using 语句以正确的方式调用对象的 Dispose 方法,并且(当您像之前展示的那样使用它时)还会在 Dispose 被调用时导致对象本身超出范围。在 using 块内,对象是只读的,不能被修改或重新分配。

这来自 这里


该链接并不是一个真正的链接(太过笼统),而是一个通用的搜索页面(“使用”有654,563个结果)。 - Peter Mortensen

1

花括号外的所有内容都被处理掉了,因此如果您不再使用对象,将其处理掉是非常好的选择。这是因为如果您有一个SqlDataAdapter对象,并且在应用程序生命周期中仅使用一次,并且只填充一个数据集并且不再需要它,您可以使用以下代码:

using(SqlDataAdapter adapter_object = new SqlDataAdapter(sql_command_parameter))
{
   // do stuff
} // here adapter_object is disposed automatically

1

当您使用using时,它将在using的范围结束时调用对象的Dispose()方法。因此,您可以在Dispose()方法中编写大量的清理代码。

一个要点:

如果您实现了IDisposable,请确保在Dispose()实现中调用GC.SuppressFinalize(),否则自动垃圾回收将尝试在某个时刻对其进行Finalize,这至少会浪费资源,如果您已经Dispose()了它。


它具有间接影响。因为您已经显式地处理了该对象,所以它不需要终结并且可以更早地被垃圾回收。 - Kent Boogaart

1

虽然并不是非常重要,但是使用也可以在运行时更改资源。

是的,像之前提到的那样,它是可丢弃的,但是也许你不想让这些资源与其他资源不匹配,干扰程序的其他执行。因此你需要销毁它们以避免影响其他地方。


1
它还可以用于创建范围,例如:
class LoggerScope:IDisposable {
   static ThreadLocal<LoggerScope> threadScope = 
        new ThreadLocal<LoggerScope>();
   private LoggerScope previous;

   public static LoggerScope Current=> threadScope.Value;

   public bool WithTime{get;}

   public LoggerScope(bool withTime){
       previous = threadScope.Value;
       threadScope.Value = this;
       WithTime=withTime;
   }

   public void Dispose(){
       threadScope.Value = previous;
   }
}


class Program {
   public static void Main(params string[] args){
       new Program().Run();
   }

   public void Run(){
      log("something happend!");
      using(new LoggerScope(false)){
          log("the quick brown fox jumps over the lazy dog!");
          using(new LoggerScope(true)){
              log("nested scope!");
          }
      }
   }

   void log(string message){
      if(LoggerScope.Current!=null){
          Console.WriteLine(message);
          if(LoggerScope.Current.WithTime){
             Console.WriteLine(DateTime.Now);
          }
      }
   }

}

0

它基本上与调用Playback和Verify all相同,只是在Dispose()方法中执行。 - George Mauer

0
“using”语句告诉.NET在不再需要using块中指定的对象时释放它。因此,您应该为需要清理的类(如System.IO类型)使用“using”块。

0

使用 using 语句会自动调用指定对象的 dispose 方法。该对象必须实现 IDisposable 接口。只要这些对象是相同类型,就可以在一个语句中使用多个对象。

CLR 将您的代码转换为 CIL。而 using 语句则被转换为 try 和 finally 块。这就是 using 语句在 CIL 中的表示方式。一个 using 语句被分为三个部分:获取、使用和释放。首先获取资源,然后将使用包含在带有 finally 子句的 try 语句中。最后,在 finally 子句中释放对象。


-3
< p > 使用 < em > using 子句用于定义特定变量的作用域。 < p > 例如:
Using(SqlConnection conn = new SqlConnection(ConnectionString)
{
    Conn.Open()

    // Execute SQL statements here.
    // You do not have to close the connection explicitly
    // here as "USING" will close the connection once the
    // object Conn goes out of the defined scope.
}

这可能会误导某些人,使用“is”来处理对象。也许您将其与代码块混淆了,如果您想限制变量的范围,可以使用嵌套代码块: public static void Main(params string[] args){ { //嵌套代码块 } } - luiseduardohd
@luise.. 对的。1. 使用Using语句可以释放对象占用的内存。 - Riya Patil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接