4

我是 C# 的新手,一直是帕斯卡爱好者,直到我在 Depth 中找到 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. 我什么时候应该使用“使用”而不是“尝试”,什么时候应该使用“尝试”而不是“使用”?

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

提前致谢!

4

7 回答 7

10

使用和尝试是两件非常不同的事情,并且是完全正交的。

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

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

using有关在网络(或 SO)上为“ ”使用 seach 的更多信息IDisposable

于 2009-04-22T12:36:48.617 回答
7

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

try/catch 语句通常用于完全不同的目的,但 try/catch/finally 或 try/finally 中的 finally 块与无条件执行的目的相同。using 语句为您购买自动调用配置。

推荐 David Hayden 的文章:C# 代码审查 - C# Using Statement - Try / finally - IDisposable - Dispose() - SqlConnection - SqlCommand

关于 using 语句的
MSDN 文章 MSDN 关于 Try/Catch/Finally的文章

于 2009-04-22T12:34:54.287 回答
4

using与 try/catch 完全不同。一个using块用于确保一个IDisposableist被释放,这意味着Dispose()被调用。尝试、捕捉并最终处理异常。using块类似于:

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

this 和 a 之间的区别在于using变量的范围,因为using它是在块内部创建的。

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

于 2009-04-22T12:36:05.763 回答
3

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

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

所以它们并不是真正可交换的。

于 2009-04-22T12:36:15.873 回答
2

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

using 是一种更短且更友好的表示法try{}finally{ Dispose() },因此是首选。

于 2009-04-22T13:10:16.383 回答
1

using is just a try {} finally {} with the finally calling the dispose() method of something that implements IDispose. So as a good rule of thumb if the object supports IDispose ... use using{}

于 2009-04-22T12:40:58.170 回答
0

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

Using-blocks 用于严格限定变量的范围,并且对于您在很短的时间内不需要的大量内存对象等事情很有用。它们基本上是给运行时的一条消息,“在这个块之后,摆脱对象”。

于 2009-04-22T12:37:25.200 回答