C#的类型系统

​ C#所有类型全部从System.Object类派生,因此所有类型都保证了拥有一套最基本的方法,即System.Object所声明的方法,包括四个公共和两个受保护方法。

  1. Equals:判断两个对象是否具有相同值,返回bool值

  2. GetHashCode:返回对象的值的哈希码

  3. ToString:默认返回类型完整名称,经常被重写,最经典的是int型重写该方法以返回其值的字符串形式

  4. GetType:返回一个从Type类派生的类型实例,以指出调用该方法的对象时什么类型,常用于为反射提供与对象类型相关的元数据信息

  5. MemberwiseClone:浅复制

    关于深浅复制http://www.cnblogs.com/chenwolong/p/MemberwiseClone.html

  6. Finalize:虚方法,在对象被标志为应该被作为垃圾回收之后,但在内存真正被回收之前,会调用该方法

​ C#语言特点:

  • C#语言是静态类型的

    C#3以及之前版本中,C#是一门完全静态的语言。C#4引入了动态类型,但在unity3d中绝大部分代码仍然是静态类型的

  • C#语言在大多数的时候是显示类型的

    用var来声明隐式类型变量,其变量实际上在编译阶段是被确定的,只不过是由编译器推断出来的。

  • C#语言是类型安全的

    C#允许合理的类型转换,但是不能将两个完全不相同的类型互相转换。

值类型和引用类型

​ 值类型变量与引用类型变量的内存分配模型不一样。

​ 为了理解清楚这个问题,首先需了解两种不同类型的内存区域:线程堆栈(Thread Stack)和托管堆(Managed Heap)。(对于线程堆栈我又习惯称为线程栈)

​ 堆栈stack:

  • ​ 堆栈实际上是向下填充,即由高内存地址指向低内存地址填充。

  • ​ 堆栈的工作方式是先分配内存的变量后释放(先进后出原则)。

  • ​ 堆栈中的变量是从下向上释放,这样就保证了堆栈中先进后出的规则不与变量的生命周期起冲突!

  • ​ 堆栈的性能非常高,但是对于所有的变量来说还不太灵活,而且变量的生命周期必须嵌套。

通常我们希望使用一种方法分配内存来存储数据,并且方法退出后很长一段时间内数据仍然可以使用。此时就要用到堆(托管堆)!

​ 堆(托管堆)heap

  • ​ 此堆非彼堆,.NET中的堆由垃圾收集器自动管理。

  • ​ 与堆栈不同,堆是从下往上分配,所以自由的空间都在已用空间的上面。

一般而言,值类型存储在线程栈上,但有时可能分配在托管堆上,例如:

  • 数组中的元素
  • 引用类型中的值类型字段
  • 迭代器块中的局部变量
  • 闭包情况下的匿名函数(lamda)中的局部变量

值类型大体上分为结构和枚举,结构并非轻量级的类!

引用类型一般有Dynamic,Object,string

参考自C#垃圾回收和托管堆及堆栈 https://blog.csdn.net/lin37985/article/details/46576627 及unity3d脚本编程一书

posted @ 2020-08-26 15:47  AMzz  阅读(320)  评论(0编辑  收藏  举报
//字体