程序在运行时,它的数据必须在内存中!一个数据项需要多大内存、存储在什么地方、以及如何存储都依赖于该数据项的数据类型,
运行中的程序使用两个内存区来存储数据,没错就是我们常说的“堆”和“栈”,栈是一个内存数组遵循后进先出原则,系统接管所有栈,不需要我们在做任何处理,
栈中一般存储某些类型变量的值、程序当前的执行环境、传递给方法的参数。
堆是一块内存区域,在堆里可以分配大块的内存用于存储某类型的数据,与栈不同堆里的内存可以任意顺序存入和移除,数据项的类型定义了存储数据需要的内存大小、
组成该类型的数据成员以及该类型能执行的函数,类型还决定了对象在内存中的存储位置(也就是堆和栈)
类型被分为两种:值类型和引用类型、这两种类型的对象在内存种的存储方式不同,其中值类型只需要一段单独的内存,用于存储实际的数据,而引用类型需要两段内存,
第一段存储实际的数据,它总是在堆上,第二段是引用,指向数据在堆中的存放位置;也就是说值类型存储在栈上,引用类型的引用存储可以存储在栈上也可以存储在堆上
这取决于环境,而实际数据总是存储在堆上,这里需要注意的是对于引用类型的任何对象,它所有的数据成员都存放在堆中,无论它们是值类型还是引用类型
值类型 从System.Value 派生该类型提供了与System.Object 相同的方法 但是System.ValueType 重写了 Equals 方法 能在两个对象的字段值完全匹配的前提下返回true 此外 System.ValueType 重写了GetHashCode 方法 生成哈希码时,这个重写方法所用的算法会将对象的实例字段中的值考虑在内由于这个默认实现存在性能问题,所以在自己定义值类型的时候应该重写 Equals 和 GetHashCode方法,并提供显示实现.
由于不能将值类型作为基类型来定义新的类型或者新的引用类型,所以不应在值类型中引用任何新的虚方法,任何方法都不能是抽象的,所有方法都隐式密封不能被重写
将值类型复制给另一个值类型变量会逐字段的复制,将引用类型的变量赋值给另一个引用变量的时候,符之的是内存地址