C#变量内存存贮问题

 整理了一下,自己发的帖子,  (感谢热心的网友的回复)

 

 

局部变量要看的,值类型直接放在栈里,引用类型内容放在堆里,对其的引用指针放在栈里。
数组时引用类型,因此数组元素放堆里。

 

(字符串是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
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值