整理了一下,自己发的帖子, (感谢热心的网友的回复)
局部变量要看的,值类型直接放在栈里,引用类型内容放在堆里,对其的引用指针放在栈里。
数组时引用类型,因此数组元素放堆里。
(字符串是unicode编码,所以不存在'\0',这是另外一个问题!!!! )
只有局部变量、成员变量、静态成员变量、常量。你说的如果是局部变量(函数体内申明的变量),那么对于值类型变量来说,放在堆栈上,对于引用类型变量,引用在堆栈上,对象本身在托管堆上。
class Class1 { ... }
class Class2
{
public Class1 GetClass1() { Class1 c1 = new Class1(); return c1; }
}
很明显,c1这个引用在堆栈上面,但是这个代码没有任何问题,因为 c1 指向的对象在堆上面。
另外, 网上说, 数组是 Array的实例, 而且,声明数组的时候顺便用new来初始化,
这个new 我感觉类似于C++中的new吧?
完全不同。C++的new是为对象指针分配内存,而C#没有指针的概念,引用和指针完全不同。因为C#是自动垃圾回收的,所以C#不会出现一个引用指向一个非法的地址,或者内存泄漏的问题。
void Main 这个函数,为什么要放在一个类中,虽然是静态方法,但是很诡异。
C#不支持全局函数,全局变量,所有的东西必须都在类里面。
"""通常的,int/char/float/struct等值类型,是在Stack中。而引用类型则构造在Heap中,引用本身是在Stack中的。"""""
这种理解错误。和值类型没有关系:
比如:
class Class1
{
public int x = 0; // x 在堆上。
}
再看一个例子
class Class1
{
public int x = 0;
}
public void somemethod() // 函数
{
int x = 0; // 这个x变量是值类型的,分配在stack上
Class1 c = new Class1(); // Class1的实例对象,其内存块分配在Heap上的,但c的引用是在Stack里的
c.x = 5; // 通过引用,找到在堆上内存块里的值类型成员x
}