public int selectNum(string sql) 
{
            SqlConnection conn = new SqlConnection(str);
            conn.Open();
            cmd.CommandText = sql;
            returnNum = int.Parse(cmd.ExecuteScalar().ToString());
            conn.Close();
            return returnNum;
}
这样写的的话 我调用方法的时候才创建sqlConnection对象,离开的时候会把这个方法从内存中清除吗?
如果这个方法是静态的那又是什么时候创建的?
因为是新手,语言有可笑的地方见谅.

解决方案 »

  1.   

    如果把sqlConnection对象换成其他对象的话,就会从内存中清除掉。
    但sqlConnection比较特别,离开的时候会自动把该连接放到连接池中去。(除非你在连接字符串上显示声明不使用连接池)
    静态的话,会在第一次使用的时候创建(只有第一次的时候创建一次),生命周期和整个应用程序一样。
    不过sqlConnection不可能使用静态的,我看到很多人的dbhelper类都把sqlConnection做成静态的。这样的话再同时有2个连接的时候就出问题了。
      

  2.   

    局部变量是存在栈中的,如果不再保留对它的引用,垃圾回收器会回收。
    如果是静态变量,会在第一次使用的时候创建一次,生命周期和整个应用程序一样。
    sqlConnection我不熟悉。
      

  3.   

    public int selectNum(string sql)
            {
                SqlConnection conn = new SqlConnection(str);
                conn.Open();
                SqlCommand cmd = new SqlCommand(null, conn);
                returnNum = int.Parse(cmd.ExecuteScalar().ToString());
                conn.Close();
                return returnNum;
            }
    这样调用方法后,如果sqlConnection对象会被清除的话,sqlConnection关没关闭都无所谓吗?
      

  4.   

    要 弄清楚对象的内存分配。
    SqlConnection conn = new SqlConnection(str);1.离开方法时, conn在堆栈上,会被释放。而new SqlConnection(str);会在托管堆中,成为垃圾对象,等待着GC回收。
    2. 要显示关闭sqlConnection,sqlConnection本身是托管对象,受GC管理,但是它里面引用到了非托管资源,不受GC管理。
      

  5.   

    在你这个代码中关闭关闭对代码效果和执行上没什么影响。
    但是调用close后连接才会回归连接池,这也是写代码的良好习惯。
      

  6.   

    private void load()
            {
                System.Threading.Thread thread1 = new System.Threading.Thread(delegate()
                {
                        frmMain = new Music_Main();
                        frmMain.Music_Main_Load();
                });
                thread1.Start();
            }
    我调用10次这个方法,如果都执行完了,那么是不是什么都不会留下?
      

  7.   

    执行完,一般 托管堆中的对象会在,这些对象 什么时候释放,要问 GC了,GC回收不确定。