C#内存分配

值类型 & 引用类型

我们知道,C#变量类型可以分为值类型和引用类型,值类型包括:简单类型(包括DateTime)、结构类型和枚举类型,引用类型包括类、数组、接口等。在变量初始化时,值类型在栈中操作,而引用类型在内存堆中操作;栈(Stack)是在编译时分配内存空间,而堆(Heap)在运行时动态分配内存空间,可以根据程序的运行情况动态的分配内存大小,因此,值类型在内存中占用一个预定义的字节数。这里的栈和数据结构中的栈Stack一样,都是先进后出的,栈中上面的变量总是比下面的变量先离开作用域。

static

在C#中没有全局变量的概念,可以通过静态变量实现全局使用的效果,静态变量在类中类似全局变量,保存公共信息,所有该类的实例共享该值。
声明方式很简单, 只需要在数据类型前面加上static关键字即可,引用时用 类名.静态变量 引用。
静态变量存放在内存堆或者自由存储区,常量是存放在常量存储区。

如果一个类中有static类型的变量,那么这个类所有实例都共享这个变量.
在web开发中要谨慎使用ASP.NET 的static变量,因为每个对象的实例都可以访问这个static变量,容易导致串号(张三的名字被李四用了)现象。
可以使用Session或者Cookie形式代替。

C#内存分配机制基于托管堆(managed heap)和垃圾回收(garbage collection)。 1. 托管堆(Managed Heap):在C#中,所有的对象都存储在托管堆中。托管堆是一块被.NET运行时分配的内存区域,用于存储托管对象的实例和数据。托管堆是按照分代(generational)的方式进行管理,将对象分为不同的代,根据对象的生命周期和使用频率来优化垃圾回收效率。 2. 对象创建:当使用`new`关键字创建一个对象时,CLR(Common Language Runtime)会在托管堆上分配一块足够大小的内存来存储对象的数据。CLR会进行必要的初始化工作,如设置对象头信息等。 3. 垃圾回收:C#采用垃圾回收机制来管理内存分配和释放。垃圾回收器会定期扫描托管堆,标记那些仍然被引用的对象,并清除那些没有被引用的对象。垃圾回收器使用了根引用(root references)来确定哪些对象是活动的,其他对象则被认为是可回收的。 4. 引用计数:在某些情况下,C#的垃圾回收器可能会使用引用计数来辅助确定对象是否可以被回收。每当一个对象被引用时,引用计数加1;当一个引用被取消或离开作用域时,引用计数减1。当引用计数为0时,对象可以被回收。 需要注意的是,C#的垃圾回收器并非实时的,而是在需要的时候进行垃圾回收。具体的垃圾回收策略和算法由.NET运行时环境负责管理,而开发人员无需手动进行内存管理。不过,开发人员可以通过使用`IDisposable`接口手动释放一些非托管资源,以提前释放内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值