我是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);
}
我的问题:
如果发生异常会发生什么 在“使用”声明中?
我应该何时使用“使用”而不是“尝试” 当“尝试”“使用”时?
“使用”的目的是什么 声明?
提前致谢!
答案 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
是任何对象构造的占位符。有关详细信息,请参阅using
,IDisposable
下的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用于严格限定变量,对于内存繁重的对象非常有用,这些对象在很短的时间内不需要。它们基本上是对运行时的消息,“在此块之后,摆脱对象”。