C# 关于值类型和引用类型在堆或栈中的存储

今天来捋一捋值类型和引用类型各是在哪里存储的,堆?还是栈?

首先值类型和引用类型,是C#中变量的两种类型。值类型包括我们常用的整型、浮点型、布尔型数值、枚举等。引用类型包括类、接口、数组、委托等。

至于堆和栈,是两种不同的内存区域,堆(heap),栈(即堆栈(stack))

简单来说,值类型和引用类型变量本身在栈中分配内存,引用类型的实例在堆中分配内存。(要注意的是,一定要理解清楚引用类型变量本身和引用类型的实例的区别,引用类型变量好比一个指针,它所指向的内容即引用类型的实例)。有时候又会看到一些说法,值类型在其所定义的位置分配内存,这让人感到很混乱却也不得不在意,下面简单捋一下。

如下面代码:

public class TestClass 
{
      int a = 0;
}

public void Function()
{
     int b = 0;
     TestClass class1 = new TestClass();
​​​​​​​}

方法Function中定义的值类型(整型b)在栈中分配,引用类型(类class1)以一个类似于指针的形式也存储于栈中,而类的实例对象即代码中class1所引用的实际数据(整型a)是在堆上面分配的。这就可以理解,为什么有的地方会说“值类型在其所定义的地方分配”,因为上述代码中的值类型a由于定义在类中,作为类的一个成员,在类实例化时是被分配到堆中的。

因此,更进一步地,可以理解为:值类型作为一个方法中的局部变量时,是在栈中分配的,而当作为类的成员变量时,是分配在堆中的

在上面代码的TestClass中添加一个Run函数:

public class TestClass 
{
    int a = 0;
    public void Run()
    {
        int c = 0;
    }
}

public void Function()
{
    int b = 0;
    TestClass class1 = new TestClass();
    class1.Run();
​​​​​​​}

此时,整型a是在堆中分配内存,而Run函数中的整型c在栈中分配内存。

因此关于值类型、引用类型各自在堆或栈上的内存分配可以总结为:

>>>!!!值类型作为方法中的局部变量时,在栈中分配,而作为类的成员变量时,在堆中分配;引用类型变量在栈中分配,引用类型的实例在堆中分配!!!<<<。

(梳理了一下自己的思路,对知识点的理解更清晰了,若有误还望指正啦。)

  • 14
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值