值类型和应用类型的区别(内存分配上讲)

本文解析了内存中的栈和堆的概念,介绍了它们的垃圾回收机制及数据类型的存储方式。通过示例对比了值类型和引用类型在栈和堆中的表现。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//栈stack(先进后出)和堆heap)(先进先出)。
//在内存中,栈(stack)和堆(heap)可以理解为两个存储容器。
//堆像一个仓库,存放着各种信息,调用完毕不会被立即清理

//1.堆和栈上的垃圾回收机制
//栈有自我维护特性,执行完语句马上释放不会造成资源泄漏。

//2.堆需要GC(垃圾回收器 Garbage Collection)不定时的回收已不再使用的资源则需,并且符合GC回收的规则,很多堆上的内容在程序退出前都没有被回收,很可能是无意中某处还保留着内容的引用导致,这将严重影响性能,GC回收一般发生在程序内存不够用时,否则不会发生,除非手动调用GC强制执行回收资源。

//3.栈(stack)和堆(heap)中存储的数据类型
//这里的数据类型特指值类型(基本数据类型,结构,数组)和引用类型(类,string,object,接口,委托)。
//值类型存储在栈或堆中取决于声明的位置,引用类型总是存储在堆上。

namespace TeachStackandHeap
{
    /// <summary>
    /// 定义一个结构体
    /// </summary>
    public struct ExampleStruct//值类型
    {
        //定义一个整数
        public int intVal;
    }
    /// <summary>
    /// 定义一个类
    /// </summary>
    public class ExampleClass//引用类型
    {
        //定义一个整数
        public int intVal;
    }
    class Program
    {
        static void Main(string[] args) {
            //使用ExampleClass类(引用类型),实例化对象并赋值
            ExampleClass Exa= new ExampleClass();
            Exa.intVal = 12;//单独复制


            //再声明对象,赋值给Exa2
            ExampleClass Exa2 = Exa;
            Exa2.intVal =24;
            Console.WriteLine("Exa的值为:{0}\t Exa2的值为:{1}", Exa.intVal, Exa2.intVal);


            //使用ExampleStruct(值类型),实例化对象并赋值
            ExampleStruct ExS = new ExampleStruct();
            ExS.intVal = 16;//单独赋值

            //再声明对象,赋值给ExS2
            ExampleStruct ExS2 = ExS;
            ExS2.intVal = 32;
            Console.WriteLine("ExS的值为:{0}\t ExS2的值为:{1}", ExS.intVal, ExS2.intVal);
            
            //總結如下:
            //1、它们存储的位置不一样
            //2、如果是引用类型,当两个对象指向同一个地方,修改某一个的时候,其它 对象的值会发生改变
        }
    }
}

参考图:

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值