none
使用using和try{}catch{}finally{}结果的问题??? RRS feed

  • 问题

  • 看到很多MSDN的关于连接到数据库的实例总是使用using,例如:

      using
     (SqlConnection connection = 
    new SqlConnection(connectionString))
    {
    SqlDataAdapter adapter = new SqlDataAdapter();
    adapter.SelectCommand = new SqlCommand(
    queryString, connection);
    adapter.Fill(dataset);
    return dataset;
    }

    为什么不使用try{}catch{}finally{}结构来实现呢?
    如果using代码块中产生异常怎么办?
    使用using和try{}catch{}finally{}分别有何优劣?

    求教,谢谢!!!

    Never bend, never break, never back down!
    2010年6月22日 6:23

答案

  • using的作用是定义一个范围,在范围结束时处理对象。

    场景:
    当在某个代码段中使用了类的实例,而希望无论因为什么原因,只要离开了这个代码段就自动调用这个类实例的Dispose。
    要达到这样的目的,用try...catch来捕捉异常也是可以的,但用using也很方便。

    例如:

    using (Class1 cls1 = new Class1(), cls2 = new Class1())
    {
      
    // the code using cls1, cls2


    }
     // call the Dispose on cls1 and cls2


    这里触发cls1和cls2的Dispose条件是到达using语句末尾或者中途引发了异常并且控制离开了语句块。

    • 已标记为答案 Sven K 2010年6月28日 10:13
    2010年6月22日 8:11
  • 会,但是处理的过程会重新抛出异常。

     



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    • 已标记为答案 Sven K 2010年6月28日 10:13
    2010年6月25日 22:12
    版主

全部回复

  • using的作用是定义一个范围,在范围结束时处理对象。

    场景:
    当在某个代码段中使用了类的实例,而希望无论因为什么原因,只要离开了这个代码段就自动调用这个类实例的Dispose。
    要达到这样的目的,用try...catch来捕捉异常也是可以的,但用using也很方便。

    例如:

    using (Class1 cls1 = new Class1(), cls2 = new Class1())
    {
      
    // the code using cls1, cls2


    }
     // call the Dispose on cls1 and cls2


    这里触发cls1和cls2的Dispose条件是到达using语句末尾或者中途引发了异常并且控制离开了语句块。

    • 已标记为答案 Sven K 2010年6月28日 10:13
    2010年6月22日 8:11
  • 即使using(){发生异常}还是会释放using中声明的对象~

    你可以看一下MSDN Library中关于using语句的页面(http://msdn.microsoft.com/zh-cn/library/yh598w02.aspx)~特别是备注的第三段~


    本帖内容仅供参考,没有任何保证. The post is for reference only, without any warranty.
    2010年6月22日 9:20
    版主
  • using会生成catch语句在里面dispose之后重新throw,所以不用另外写

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年6月22日 19:59
    版主

  • using的作用是定义一个范围,在范围结束时处理对象。

    场景:
    当在某个代码段中使用了类的实例,而希望无论因为什么原因,只要离开了这个代码段就自动调用这个类实例的Dispose。
    要达到这样的目的,用try...catch来捕捉异常也是可以的,但用using也很方便。

     

    例如:

    using  (Class1 cls1  =   new  Class1(), cls2  =   new  Class1())
    {
      
    //  the code using cls1, cls2


    }
      //  call the Dispose on cls1 and cls2


    这里触发cls1和cls2的Dispose条件是到达using语句末尾或者中途引发了异常并且控制离开了语句块。

     

    看了各位的回答,基本明白了using的作用。谢谢各位!!!

    但还有个问题就是如果using中发生异常,它只会抛出异常,不会处理异常。对吗?


    Never bend, never break, never back down!
    2010年6月25日 0:18
  • 可以这么说,他不会处理异常!
    2010年6月25日 8:02
  • 会,但是处理的过程会重新抛出异常。

     



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    • 已标记为答案 Sven K 2010年6月28日 10:13
    2010年6月25日 22:12
    版主