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

abc19960508 2013-01-06 11:21:25

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对象,离开的时候会把这个方法从内存中清除吗?
如果这个方法是静态的那又是什么时候创建的?
因为是新手,语言有可笑的地方见谅.
...全文
350 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hauk 2013-01-06
  • 打赏
  • 举报
回复
引用 4 楼 abc19960508 的回复:
引用 2 楼 haukwong 的回复:如果把sqlConnection对象换成其他对象的话,就会从内存中清除掉。 但sqlConnection比较特别,离开的时候会自动把该连接放到连接池中去。(除非你在连接字符串上显示声明不使用连接池) 静态的话,会在第一次使用的时候创建(只有第一次的时候创建一次),生命周期和整个应用程序一样。 不过sqlConnection不可……
在你这个代码中关闭关闭对代码效果和执行上没什么影响。 但是调用close后连接才会回归连接池,这也是写代码的良好习惯。
claymore1114 2013-01-06
  • 打赏
  • 举报
回复
引用 4 楼 abc19960508 的回复:
引用 2 楼 haukwong 的回复:如果把sqlConnection对象换成其他对象的话,就会从内存中清除掉。 但sqlConnection比较特别,离开的时候会自动把该连接放到连接池中去。(除非你在连接字符串上显示声明不使用连接池) 静态的话,会在第一次使用的时候创建(只有第一次的时候创建一次),生命周期和整个应用程序一样。 不过sqlConnection不可……
要 弄清楚对象的内存分配。 SqlConnection conn = new SqlConnection(str); 1.离开方法时, conn在堆栈上,会被释放。而new SqlConnection(str);会在托管堆中,成为垃圾对象,等待着GC回收。 2. 要显示关闭sqlConnection,sqlConnection本身是托管对象,受GC管理,但是它里面引用到了非托管资源,不受GC管理。
abc19960508 2013-01-06
  • 打赏
  • 举报
回复
引用 2 楼 haukwong 的回复:
如果把sqlConnection对象换成其他对象的话,就会从内存中清除掉。 但sqlConnection比较特别,离开的时候会自动把该连接放到连接池中去。(除非你在连接字符串上显示声明不使用连接池) 静态的话,会在第一次使用的时候创建(只有第一次的时候创建一次),生命周期和整个应用程序一样。 不过sqlConnection不可能使用静态的,我看到很多人的dbhelp……
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关没关闭都无所谓吗?
Frog1228 2013-01-06
  • 打赏
  • 举报
回复
局部变量是存在栈中的,如果不再保留对它的引用,垃圾回收器会回收。 如果是静态变量,会在第一次使用的时候创建一次,生命周期和整个应用程序一样。 sqlConnection我不熟悉。
Hauk 2013-01-06
  • 打赏
  • 举报
回复
如果把sqlConnection对象换成其他对象的话,就会从内存中清除掉。 但sqlConnection比较特别,离开的时候会自动把该连接放到连接池中去。(除非你在连接字符串上显示声明不使用连接池) 静态的话,会在第一次使用的时候创建(只有第一次的时候创建一次),生命周期和整个应用程序一样。 不过sqlConnection不可能使用静态的,我看到很多人的dbhelper类都把sqlConnection做成静态的。这样的话再同时有2个连接的时候就出问题了。
lhx527099095 2013-01-06
  • 打赏
  • 举报
回复
局部变量 方法结束后垃圾回收器会负责回收 具体什么时候回收销毁 这个比较玄妙 由垃圾回收器自己决定
fghj3 2013-01-06
  • 打赏
  • 举报
回复
学习了 thanks
claymore1114 2013-01-06
  • 打赏
  • 举报
回复
引用 7 楼 abc19960508 的回复:
引用 5 楼 claymore1114 的回复:引用 4 楼 abc19960508 的回复:引用 2 楼 haukwong 的回复:如果把sqlConnection对象换成其他对象的话,就会从内存中清除掉。 但sqlConnection比较特别,离开的时候会自动把该连接放到连接池中去。(除非你在连接字符串上显示声明不使用连接池) 静态的话,会在第一次使用的时候创建(……
执行完,一般 托管堆中的对象会在,这些对象 什么时候释放,要问 GC了,GC回收不确定。
abc19960508 2013-01-06
  • 打赏
  • 举报
回复
引用 5 楼 claymore1114 的回复:
引用 4 楼 abc19960508 的回复:引用 2 楼 haukwong 的回复:如果把sqlConnection对象换成其他对象的话,就会从内存中清除掉。 但sqlConnection比较特别,离开的时候会自动把该连接放到连接池中去。(除非你在连接字符串上显示声明不使用连接池) 静态的话,会在第一次使用的时候创建(只有第一次的时候创建一次),生命周期和整个应用程……
private void load()
        {
            System.Threading.Thread thread1 = new System.Threading.Thread(delegate()
            {
                    frmMain = new Music_Main();
                    frmMain.Music_Main_Load();
            });
            thread1.Start();
        }
我调用10次这个方法,如果都执行完了,那么是不是什么都不会留下?

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧