我应该在C#中使用try{}还是using()?

4

我是一个C#的新手,之前一直喜欢使用Pascal语言,直到我接触了深入理解C#这本书。在Delphi中有一个try{}语句,在C#中也有相应的实现。

然而,我看到有些人提到“Using(){}比try{}更好”。

以下是一个示例:

   //This might throw an exception
   sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
   sock.Connect(ip, port);

   //Try statement
   try
   {
       sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
       sock.Connect(ip, port);
   catch
   {
   }

   //using(){}
   using(sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
   {
          sock.Connect(ip, port);
   }

我的问题:

  1. 如果在“using”语句中发生异常会怎样?

  2. 什么时候应该使用“using”而不是“try”,什么时候应该使用“try”而不是“using”?

  3. “using”语句的目的是什么?

提前致谢!


https://dev59.com/bkbRa4cB1Zd3GeqP3scO - Andrew Bullock
7个回答

10

使用和尝试是两个非常不同的概念,它们完全正交。

如果异常发生并且不在try块中,堆栈将展开直到找到适当的异常处理程序。这与using语句无关。

在您想确保对象在使用后被正确清理时,请使用using {} - 在您的示例中,sock将在using块之后正确地被处理。

有关使用using的更多信息,请在网络(或SO)上搜索“IDisposable”。


7
使用using语句是在创建(和使用)实现IDisposable接口的新对象时使用的。即使在using块内部引发异常,using语句也会始终处理该对象。try/catch语句通常具有完全不同的目的,但是try/catch/finally或try/finally中的finally块在某种程度上具有与using语句相同的作用,因为它总是被无条件执行。使用using语句可以自动调用dispose方法。
我建议阅读David Hayden的文章:C# 代码审查 - C# Using 语句 - Try / Finally - IDisposable - Dispose() - SqlConnection - SqlCommand MSDN对using语句的说明
MSDN对Try/Catch/Finally的说明

4

using与try/catch完全不同。using块用于确保IDisposable被释放,这意味着会调用Dispose()方法。而try、catch和finally则处理异常。一个using块类似于:

IDisposable d; try { d = m; } finally { d.Dispose(); }

using 相比,最大的区别在于变量的作用域,因为使用 using 时,变量是在块内部创建的。 m 是任何对象构建的占位符。更多信息请参见 MSDN 上的 usingIDisposable。特别是有关处理、垃圾回收和非托管资源的信息值得一读。

3
使用using语句可以确保在使用完IDisposable后进行释放。
异常用于捕获无法预计的异常情况。
因此,它们并不是真正的可互换的。

2

这不是关于“尝试”的问题,而是try/finally和/或try/catch的区别。它们有完全不同的目的。

使用using是try{}finally{ Dispose() }的一种稍微更短和友好的表示法,因此更受欢迎。


1

使用 using 只是一个 try {} finally {} 的尝试,其中 finally 调用实现了 IDispose 接口的某个对象的 dispose() 方法。因此,作为一个好的经验法则,如果对象支持 IDispose ... 就使用 using{}。


0

Try块是用于可能发生意外情况的代码块(例如数据库故障、连接故障等),它们应该仅用于此目的。准备捕获异常会消耗大量资源,如果您可以限制使用try-catch块,那么效果会更好。尽管如此,它们是防御性编程的非常强大的工具,性能损失绝对是值得的,因为您可以从异常日志中收集大量信息和统计数据。

Using块用于紧密地限定变量的范围,对于像内存占用较高的对象这样的东西非常有用,您不需要超过非常短的时间。它们基本上是向运行时发送的消息,即“在此块之后,摆脱该对象”。


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