我学C#1个月了,看到很多书籍都省略了很多Using …… try…..catch块和许多其他推荐的编码实践。
自己对这方面不是很熟悉,我不清楚他们有什么优点,也不清楚怎么去应用他。比如:不清楚为什么要用using(SqlConnection cn = new SqlConnection(strConn))等。
特求以下内容:
1. 请大家告诉我什么情况下去用,怎么用,最好有例子。发网址给我也行。
2. .其他良好的编码实践,比如调用存储过程,什么时候适合调用,怎么调用。
3. 编程应该注意的地方等等。例子:
            string strConn, strSQL;
            strConn = @"Data Source = .\SQLExpress; Initial Catalog = Northwind; Integrated Security = true";            strSQL = "SELECT CustomerID,CompanyName FROM Customers";            using(SqlConnection cn = new SqlConnection(strConn))
            {
                try
                {
                    cn.Open();
                }
                catch (SqlException ex)
                {
                    MessageBox.Show(ex.Message.ToString());
                }
            }            using (SqlCommand cmd = new SqlCommand(strSQL, cn))
            {
                try
                {
                    using (SqlDataReader rdr = cmd.ExecuteReader())
                    {
                        while (rdr.Read())
                            Console.WriteLine(rdr["CompanyName"]);
                        rdr.Close();
                    }
                }
                catch (SqlException ex)
                {
                    MessageBox.Show(ex.Message.ToString());
                }
            }            cn.Close();

解决方案 »

  1.   

    using
    http://msdn2.microsoft.com/zh-cn/library/yh598w02.aspx
    try catch
    http://msdn2.microsoft.com/zh-cn/library/s7fekhdy.aspx
    我觉得这已经很详细了
      

  2.   

     
    using:
     在C#和其他托管语言中,没有自动、决定性的析构方式,而是有一个垃圾收集器,它会在未来的某个时刻释放资源。它是非决定性的,因为我们不能确定这个过程在什么时候发生。忘记关闭数据库连接可能会导致.NET可执行程序的各种问题。我们使用using子句确保实现IDisposable接口的对象在退出块时立即被释放。try和catch是配对使用的,一般用来捕捉异常。
      

  3.   

    楼主的代码有问题,在第一个using块中的数据库连接对象会自动关闭,所以第二个using块是不能使用这个连接对象的,另外用了using, 那么最后的这句cn.Close()就是多于的。 
    建议修改如下:            string strConn, strSQL; 
                strConn = @"Data Source = .\SQLExpress; Initial Catalog = Northwind; Integrated Security = true"; 
                strSQL = "SELECT CustomerID,CompanyName FROM Customers"; 
                using(SqlConnection cn = new SqlConnection(strConn)) 
                { 
                    try 
                    { 
                        cn.Open(); 
                        SqlCommand cmd = new SqlCommand(strSQL, cn)) 
                        SqlDataReader rdr = cmd.ExecuteReader() 
                        while (rdr.Read()) 
                            Console.WriteLine(rdr["CompanyName"]); 
                     } 
                    catch (Exception ex) 
                    { 
                        MessageBox.Show(ex.Message.ToString()); 
                    }
                    finally
                    {
                       rdr.Close();
                    }            } 
      

  4.   

    今天刚刚用到了这个using,原来是这个作用啊。学习了。顶
      

  5.   

    谢谢3楼提醒,我运行的时候也感觉怪怪的。我是照着书打的,书名《ADO.NET 2.0 技术内幕》清华大学出版社 第110页。
      

  6.   

    请问高手,开发项目的时候需不需要用到using块 还是直接用try  catch。
      

  7.   


    我也有看MSDN ,我觉得再看看实例,能够掌握得更好。
      

  8.   

    其实用不用using取决于个人
    using(Sqlconnection con = new SqlConnection())
    {
       //代码执行块
    }using 的简单的理解:括号里定义的con只在using{}这对括号内有效,出了后就没用了
      

  9.   

    try{}
    catch{}的话是用来捕捉异常的~
    就我的项目而言,基本上是没用到过using,try..catch倒是随处可见~
      

  10.   

    首先我说说你的连接字符串
      我觉得应该使用XML就是 win.config文件里面写 然后在程序里面调用  避免冗余
    在使用try时应该加上finally一般写关闭close();
    其他没什么了实践是检验真理的唯一标准
      

  11.   

    用using这种写法是不是有调用另一个程序集的意思?
      

  12.   


    //一直都是这样用,自己创建的对象自己释放
    SqlConnection cn = new SqlConnection();
    try
    {}
    finally 
    {
        cn.Dispose();
    }
      

  13.   


    string strConn, strSQL; 
                strConn = @"Data Source = .\SQLExpress; Initial Catalog = Northwind; Integrated Security = true"; 
                strSQL = "SELECT CustomerID,CompanyName FROM Customers";
                SqlConnection cn = new SqlConnection(strConn); 
                //using(SqlConnection cn = new SqlConnection(strConn)) 
                //{ 
                    try 
                    { 
                        cn.Open(); 
                        SqlCommand cmd = new SqlCommand(strSQL, cn)) 
                        SqlDataReader rdr = cmd.ExecuteReader() 
                        while (rdr.Read()) 
                            Console.WriteLine(rdr["CompanyName"]); 
                       
                    } 
                    catch (Exception ex) 
                    { 
                        MessageBox.Show(ex.Message.ToString()); 
                    }
                    finally
                    {
                       if(cn !=null)//数据连接如果不是空,即未关闭,则关闭!
                       {
                          cn.close();
                       }
                       rdr.dispose();//非close();
                       cmd.disopose();
                    }            //} 
    一般不是引用其它自定义类的数据连接,基本不需要用using
      

  14.   


    using (Font font1 = new Font("Arial", 10.0f)) {
    .. byte charset = font1.GdiCharSet;
    }会转化成 Font font1 = new Font("Arial", 10.0f);
      try
      {
        byte charset = font1.GdiCharSet;
      }
      finally
      {
        if (font1 != null)
          ((IDisposable)font1).Dispose();
      }
    }也就是说明using会保证非托管的资源在离开using作用域的时候删除。
      

  15.   

    个人认为,如果写程序的时候知道错误是什么,就用if,不建议使用try catch!
      

  16.   

    不懂为什么要这么写
    string strConn, strSQL; 
                strConn = @"Data Source = .\SQLExpress; Initial Catalog = Northwind; Integrated Security = true"; 
                strSQL = "SELECT CustomerID,CompanyName FROM Customers"; 
                using(SqlConnection cn = new SqlConnection(strConn)) 
                { 
                    try 
                    { 
                        cn.Open(); 
                        SqlCommand cmd = new SqlCommand(strSQL, cn)) 
                        SqlDataReader rdr = cmd.ExecuteReader() 
                        while (rdr.Read()) 
                            Console.WriteLine(rdr["CompanyName"]); 
                     } 
                    catch (Exception ex) 
                    { 
                        MessageBox.Show(ex.Message.ToString()); 
                    }
                    finally
                    {
                       rdr.Close();
                    }            }using 里面套 try...catch...
    using 本身就是try...catch... 多此一举嘛  降低效率  错误要用if捕捉  try...catch...效率不高
      

  17.   

    看《Effective c#》的第十五款 有很详细的说明
      

  18.   

         
         catch (Exception ex)使用是一个不好的习惯
      

  19.   

    顶这个。楼主可以看Effective C#
      

  20.   

    using有三个用法:
    1. 空间指示符  using System;
    2. 类型的别名指示符  using doc=System.Console;
    3. using用于资源管理的语句功能。在这里你提到的是它的第三点用法,基本上上面的各位高手都提到过了。嘿嘿。如上有误,多多指教。代码就不来得急附了!
      

  21.   


    那应该怎么应用?
    我在下载那个Effective C# 。 谢谢推荐这本书。
      

  22.   

    using里面new的对象必须支持IDisposable,using就是在结尾处自动执行Dispose()方法,从而避免你忘记调用Dispose()。catch时不要catch最通用的Exception,要捕捉就必须捕捉特定的Exception类型。
      

  23.   

    使用 using 是一个很好的习惯,能避免资源浪费,在USING的块内使用连接资源,超出USING的块后就会自动断开连接.
    TRY 和 CATCH 是捕捉异常的