namespace ConsoleApplication1
{
class MyClass
{
public SqlConnection sqlCon = new SqlConnection();
public void Fun()
{
SqlConnection sqlCon2 = new SqlConnection();
}
} class Program
{
static void Main(string[] args)
{
MyClass myObj = new MyClass();
myObj.Fun();
Console.WriteLine("OK");
}
}
我关于这个程序的解释大家看看对吗?
Main程序入口,在stack中压入Main的函数指令和参数, 然后myObj引用在stack里创建,指向heap里的对象。
调用myobj.Fun,在stack中压入Fun相关信息,然后执行Fun,然后在stack中创建引用sqlCon2,而sqlCon2指向的对象也存在于stack中,退出栈时,sqlCon2会自动消失吗?这就是我的主要问题。 因为数据库连接是非托管的,我没有Dispose,它会因为自己出栈,而消失吗? 所以不用去管这个sqlCon2吗? 当然sqlCon1是一定要dispose的
{
class MyClass
{
public SqlConnection sqlCon = new SqlConnection();
public void Fun()
{
SqlConnection sqlCon2 = new SqlConnection();
}
} class Program
{
static void Main(string[] args)
{
MyClass myObj = new MyClass();
myObj.Fun();
Console.WriteLine("OK");
}
}
我关于这个程序的解释大家看看对吗?
Main程序入口,在stack中压入Main的函数指令和参数, 然后myObj引用在stack里创建,指向heap里的对象。
调用myobj.Fun,在stack中压入Fun相关信息,然后执行Fun,然后在stack中创建引用sqlCon2,而sqlCon2指向的对象也存在于stack中,退出栈时,sqlCon2会自动消失吗?这就是我的主要问题。 因为数据库连接是非托管的,我没有Dispose,它会因为自己出栈,而消失吗? 所以不用去管这个sqlCon2吗? 当然sqlCon1是一定要dispose的
解决方案 »
- 请问,SqlDataReader读出来的数据类型
- 未能加载文件或程序集“Microsoft.ReportViewer.WebForms, Version=8.0.0.0
- 尝试读取或写入受保护的内存。这通常指示其他内存已损坏
- silverlight+webService
- 孟老师,在吗?
- 我在使用Convert.ToInt32时,系统提示不能通过,请问怎么搞,前一段时间用时还可以啊!
- 在程序中如何把excel中的列指为字符型?
- 关于写应用程序时如何得到我程序中某个文件的绝对路径?
- HtmlInputFile对象怎么用?
- 我想让我的表记录登陆时间,我在表里新加了time字段可是总是有insert into 错误呢?
- DataView如果实现过滤列的功能?
- c# 国际化问题?
引用sqlCon2在栈上,没问题;但是sqlCon2指向的对象是用new创建的,new的不是都在heap吗?
==
sqlCon2指向的对象存在于heap中
在从main进入之前,clr会先加载入口函数所在程序集,加载编译Program类并分配内存,在编译到声明MyClass的对象时,会先加载MyClass所在程序集(这里应该是跟Program在同一程序集里),加载编译MyClass类并分配内存,再给MyClass声明的对象分配内存
{
SqlConnection sqlCon2 = new SqlConnection();
}//运行到此句,sqlCon2将被自动释放
static void Main(string[] args)
{
MyClass myObj = new MyClass();
myObj.Fun();
Console.WriteLine("OK");
} //运行到此句,myObj及它的成员将被自动释放或者这个代码写成这样更明了点
public class MyClass
{
public static void Main()
{
A a=new A();
a.fun();
}
}
public class A
{
public object a=new object();
public void fun()
{
object aa=new object();
}
}