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、如果是引用类型,当两个对象指向同一个地方,修改某一个的时候,其它 对象的值会发生改变
}
}
}
参考图: