C#内存分配及dynamic小结

引自 https://blog.csdn.net/tran119/article/details/81412188
https://blog.csdn.net/luoye4321/article/details/35354619
1、C#内存分配:
C#内存包括:栈,堆,全局/静态存储区,常量区,自由存储区。
堆: 这里的堆是托管堆,他们的释放我们不用去管,在程序结束后,操作系统会自动回收。
自由存储区 : 是我们需要手动申请和释放的堆区域
栈 : 当然存放的是局部变量
全局/静态存储区 : 存放的是全局变量和静态变量
常量存储区 : 里面存放的是常量
2,CLR内存分配
公共语言运行时,类似Java的jvm,是直接建立在OS上的虚拟环境,主要任务是管理代码运行。CLR现在支持几十种现代的编程语言为它编写代码,然后以一种中间语言(IL)代码的形成被执行。

CLR内存分配分三大块区域:栈、GC堆、大对象堆。
当CLR载入内存之后,会初始化两个托管堆,一个大对象堆(LOH –large object heap)和一个小对象对(SOH – small object heap)。
对于SOH,对象在执行一次垃圾回收之后,会进入到下一代。也就是说如果在第一次执行垃圾回收时,存活下来的对象会进入第1代,如果在第2次垃圾回收之后该对象仍然没有被当作垃圾回收掉,它就会成为2代对象;2代对象就是最老的对象不会在提升代数。
从代的角度看,大对象属于2代对象,因为只有在2代回收时才会处理大对象。
3、dynamic小结
dynamic是FrameWork4.0的新特性。dynamic的出现让C#具有了弱语言类型的特性。编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性。
引自 https://kb.cnblogs.com/page/92947/
var、dynamic与object的纠缠:

var和dynamic:
var和dynamic完全是两个概念,根本不应该放在一起做比较。var实际上是编译期抛给我们的“语法糖”,一旦被编译,编译期会自动匹配var 变量的实际类型,并用实际类型来替换该变量的申明,这看上去就好像我们在编码的时候是用实际类型进行申明的。
而dynamic被编译后,实际是一个object类型,只不过编译器会对dynamic类型进行特殊处理,让它在编译期间不进行任何的类型检查,而是将类型检查放到了运行期。

var 关键字不过是一个指令,它让编译器根据变量的初始化表达式推断类型;var 不是类型。

dynamic dynamicObject = new object();
var anotherObject = dynamicObject;

anotherObject 的类型就是dynamic,是编译器根据dynamicObject这个对象的类型自动给anotherObject 推断出此类型,并用实际类型来替换该变量的声明。

dynamic与object:

object objExample = 10;
Console.WriteLine(objExample.GetType());

显然,这将输出 System.Int32。 但是,因为静态类型为 System.Object,
所以您在这里需要一个显式转换:

objExample = (int)objExample + 10; //因为这里会进行静态类型检查,所以需要进行
强制类型转换  

您可以赋予不同类型的值,因为它们都是从 System.Object 继承的:

 objExample = "test"      

动态类型在后台使用 System.Object 类型。但与 object 不同的是,动态类型不需要在编译时执行显式转换操作,因为它仅在运行时识别类型:

dynamic dynamicExample = 10;
Console.WriteLine(dynamicExample.GetType());     

此段代码会输出 System.Int32。
在下面这一行中不需要转换,因为仅在运行时识别类型:

dynamicExample = dynamicExample + 10;   

因为在编译时不进行静态类型检查,所以编译通过,在运行时如果支持这个操作则进行相加,如果不支持则会出错。
可以将不同类型的值赋给 dynamicExample:

 dynamicExample = "test";   
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值