值类型与引用类型

值类型在线程栈上分配,值类型的对象包含值类型的本身。值类型不受垃圾回收器控制。
引用类型总是在托管堆上分配,new运算符会返回对象的内存地址(相当于指针)。

枚举(enum),结构(struct)是值类型。
类(class)是引用类型。

所有的值类型均派生自System.ValueType,枚举派生自System.Enum,后者派生自System.ValueType
所有的引用类型均派生自System.Object

System.ValueType也派生自System.Object,重写了Equals和GetHashCode方法。

所有的值类型及其方法都是封闭(sealed)的,不可继承。

值类型变量默认初始化为0。
引用类型变量默认初始化为null,调用会抛出NullReferenceException异常。

一个值类型赋值给另一个值类型会逐字段复制。
一个引用类型赋值给另一个引用类型只复制内存地址。

值类型对象有未装箱(unboxed)和已装箱(boxed)两种形式,引用类型对象只有已装箱(boxed)一种。

CLR允许值类型定义Finalize方法,但回收时不会调用该方法。

System.Runtime.InteropServices.StructLayoutAttribute确定字段布局
LayoutKind.Auto CLR自动决定
LayoutKind.Sequential 保持现有字段布局
LayoutKind.Explicit 利用偏移量在内存显式排列字段 System.Runtime.InteropServices.FieldOffsetAttribute确定偏移量 可以重叠
[StructLayout(LayoutKind.Explicit)]
struct A
{
[FieldOffset(0)]
int a;
[FieldOffset(0)]
int b;
}

Posted in C#

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据