日期:2014-05-17  浏览次数:20758 次

请教c#方法里申明的对象离开方法后还在内存中吗?

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对象,离开的时候会把这个方法从内存中清除吗?
如果这个方法是静态的那又是什么时候创建的?
因为是新手,语言有可笑的地方见谅.

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

要 弄清楚对象的内存分配。
SqlConnection conn = new SqlConnection(str);

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