首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是在C#中使用try{}还是use ()?

问是在C#中使用try{}还是use ()?
EN

Stack Overflow用户
提问于 2009-04-22 12:31:35
回答 7查看 5.1K关注 0票数 4

我是C#的新手,一直是pascal爱好者,直到我在C#的Depth.In Delphi中找到了一个try{}语句,这个语句也是用C#实现的。

但是,我看到你们中的一些人提到“使用(){}比尝试{}更好”。

下面是一个例子:

代码语言:javascript
复制
   //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. “使用”语句的目的是什么?

提前感谢!

EN

回答 7

Stack Overflow用户

发布于 2009-04-22 12:36:48

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

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

使用using {}时,要确保对象在使用后被正确整理--在示例中,sock将在using块之后被正确地释放。

有关使用using seach在web上(大约)用于"IDisposable“的更多信息。

票数 10
EN

Stack Overflow用户

发布于 2009-04-22 12:34:54

在创建(并使用)实现IDisposable的新对象时,将使用using语句。using语句将始终释放对象,即使在using块中引发异常也是如此。

try/catch语句通常具有完全不同的用途,但是try/catch/finally或try/finally中的finally块与无条件执行相同的用途。使用状态为您购买自动调用处理。

我推荐大卫海登的文章:C#代码评审-使用语句的C# -尝试/最后- IDisposable - Dispose() - SqlConnection - SqlCommand

关于using语句的MSDN文章

MSDN关于Try/Catch/Finally的文章

票数 7
EN

Stack Overflow用户

发布于 2009-04-22 12:36:05

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

代码语言:javascript
复制
IDisposable d; try { d = m; } finally { d.Dispose(); }

这与using之间的区别在于变量的作用域,因为using是在块中创建的。

m是任何对象构造的占位符。有关更多信息,请参见using,IDisposable下的MSDN。特别是有关处理、垃圾收集和非托管资源的信息值得阅读。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/776990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档