我应该在C#中使用try{}还是使用()呢?

我应该在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);

我是C#的新手,在我深入发现C#之前一直是pascal爱好者。在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);
   }
我的问题是:

  • 如果发生异常,会发生什么情况 在“使用”语句中

  • 什么时候我应该使用“使用”而不是“尝试” 什么时候“尝试”超过“使用”

  • “使用”的目的是什么 声明


  • 提前谢谢

    在创建(和使用)实现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是一种略短且更友好的表示法,因此是首选

    可能重复的