引自 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";