C#所有类型全部从System.Object类派生,因此所有类型都保证了拥有一套最基本的方法,即System.Object所声明的方法,包括四个公共和两个受保护方法。
-
Equals:判断两个对象是否具有相同值,返回bool值
-
GetHashCode:返回对象的值的哈希码
-
ToString:默认返回类型完整名称,经常被重写,最经典的是int型重写该方法以返回其值的字符串形式
-
GetType:返回一个从Type类派生的类型实例,以指出调用该方法的对象时什么类型,常用于为反射提供与对象类型相关的元数据信息
-
MemberwiseClone:浅复制
关于深浅复制http://www.cnblogs.com/chenwolong/p/MemberwiseClone.html
-
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脚本编程一书