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在栈中分配内存。

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

1、值类型作为方法中的局部变量时,在栈中分配,而作为类的成员变量时,在堆中分配;
2、引用类型变量(指针)在栈中分配,引用类型的实例(具体类中方法和变量等)在堆中分配

————————————————
版权声明:本文为优快云博主「Static逃」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/xinzaoan7278/article/details/82011489

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值