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

时间:2009-04-22 12:31:36

标签: c# using try-catch

我是C#的新手,直到我在Depth中找到C#之前一直是帕斯卡爱人。在Delphi中有一个try {}语句也在C#中实现。

但是,我看到有些人提到“使用(){}比尝试{}”更好。

以下是一个例子:

   //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. 如果发生异常会发生什么 在“使用”声明中?

  2. 我应该何时使用“使用”而不是“尝试” 当“尝试”“使用”时?

  3. “使用”的目的是什么 声明?

  4. 提前致谢!

7 个答案:

答案 0 :(得分:10)

使用和尝试是两个非常不同的东西,并且是完全正交的。

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

如果要确保在使用后正确整理对象,请使用using {} - 在您的示例中,在使用块之后将正确处理袜子。

有关在using上使用IDisposable搜索网络(或SO)的详细信息。

答案 1 :(得分:7)

当您创建(和使用)实现IDisposable的新对象时,将使用using语句。即使在using块中引发异常,using语句也将始终处置该对象。

try / catch语句通常用于完全不同的目的,但try / catch / finally或try / finally类中的finally块与无条件执行时的目的相同。使用声明购买自动调用处理。

我推荐David Hayden的文章:C# Code Review - C# Using Statement - Try / Finally - IDisposable - Dispose() - SqlConnection - SqlCommand

MSDN article on the using statement
MSDN article on Try/Catch/Finally

答案 2 :(得分:4)

using与try / catch完全不同。 using块用于确保处置IDisposable,这意味着调用Dispose()。尝试,捕获并最终处理异常。 using块类似于:

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

此变量与using之间的差异是变量的范围,因为using它是在块内创建的。

m是任何对象构造的占位符。有关详细信息,请参阅usingIDisposable下的MSDN。特别是关于处理,垃圾收集和非托管资源的信息值得一读。

答案 3 :(得分:3)

using语句确保IDisposable在使用后被释放。

异常用于捕获您无法解释的异常。

所以他们不是真的可以交换。

答案 4 :(得分:2)

这不是关于“尝试”,而是关于尝试/ 最终和/或尝试/ 捕获。它们的目的完全不同。

使用是try{}finally{ Dispose() }的略短且更友好的符号,因此是首选。

答案 5 :(得分:1)

using只是一个try {} finally {},最后调用了实现IDispose的dispose()方法。因此,如果对象支持IDispose,那么作为一个好的经验法则...使用{}

答案 6 :(得分:0)

try-blocks适用于可能包含意外事件的代码块(数据库失败,连接失败等),它们应该只用于它。准备好捕获异常是非常耗费资源的,如果你可以限制使用try-catch-blocks,那就更好了。也就是说,它们是防御性编程的一个非常强大的工具,性能的损失绝对值得,因为你可以从异常日志中收集大量关于你的问题的信息和统计数据。

使用-block用于严格限定变量,对于内存繁重的对象非常有用,这些对象在很短的时间内不需要。它们基本上是对运行时的消息,“在此块之后,摆脱对象”。