我应该在C#中使用try{}还是使用()呢?
我是C#的新手,在我深入发现C#之前一直是pascal爱好者。在Delphi中,有一个try{}语句也在C#中实现 然而,我看到你们中的一些人提到“使用(){}比尝试{}好” 下面是一个例子:我应该在C#中使用try{}还是使用()呢?,c#,using,try-catch,C#,Using,Try Catch,我是C#的新手,在我深入发现C#之前一直是pascal爱好者。在Delphi中,有一个try{}语句也在C#中实现 然而,我看到你们中的一些人提到“使用(){}比尝试{}好” 下面是一个例子: //This might throw an exception sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); sock.Connect(ip, port);
//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);
}
我的问题是:
提前谢谢 在创建(和使用)实现IDisposable的新对象时使用using语句。即使在using块中引发异常,using语句也将始终处理该对象 try/catch语句通常有完全不同的用途,但是try/catch/finally或try/finally中的finally块在无条件执行时有相同的用途。using STATINT为您购买自动调用以进行处理 我推荐大卫·海登的文章:
使用
与try/catch完全不同。using
块用于确保IDisposable
ist disposed,这意味着调用Dispose()
。尝试、捕获并最终处理异常。使用块的类似于:
IDisposable d; try { d = m; } finally { d.Dispose(); }
这与使用<代码>的<代码>之间的区别在于变量的范围,因为使用<代码>的<代码>是在块内部创建的
m
是任何对象构造的占位符。有关更多信息,请参阅使用
,IDisposable
下的MSDN。特别是关于处置、垃圾收集和非托管资源的信息值得一读。using语句确保IDisposable在使用后被处置
异常用于捕获无法解释的异常
所以它们不是真正可以交换的 使用和尝试是两件完全不同的事情,它们是完全正交的
如果发生异常且不在try块中,堆栈将展开,直到找到适当的异常处理程序。这与using语句无关
当您希望确保对象在使用后被正确整理时,请使用using{}
——在您的示例中,sock将在using块之后被正确处理
有关使用的更多信息,请在web上搜索“IDisposable
”Try block用于可能包含意外事件(数据库故障、连接故障等)的代码块,它们只能用于此目的。准备捕获异常是一件非常耗费资源的事情,如果您可以限制try-catch块的使用,那就更好了。这就是说,它们是防御编程的一个非常强大的工具,性能损失绝对是值得的,因为您可以从异常日志中收集大量有关问题的信息和统计信息
使用块用于严格限定变量的作用域,对于像内存大的对象这样的事情非常有用,因为您只需要很短的时间。它们基本上是给运行时的一条消息,“在这个块之后,去掉对象”。使用只是一个尝试{}finally{},最后调用实现IDispose的某些东西的dispose()方法。因此,如果对象支持IDispose。。。使用{}这不是关于“尝试”,而是关于尝试/最终和/或尝试/捕获。他们有完全不同的目的
对于try{}finally{Dispose()}
来说,using是一种略短且更友好的表示法,因此是首选 可能重复的