C# 中的引用类型和值类型

Get Started. It's Free
or sign up with your email address
C# 中的引用类型和值类型 by Mind Map: C# 中的引用类型和值类型

1. 内存中的位置

1.1. 值类型的数据存储在栈中

1.2. 引用类型的数据存储在堆中

1.3. eg

1.3.1. int numb=10, 代码中的10是值类型的数据,numb只是一个指向10的变量而已。其中10存储在栈中,变量numb也存储在栈中。

1.3.2. Person p=new Person(),代码中 new Person()所创建的对象存储在堆中,变量p存储在栈中。

1.4. 总结

1.4.1. 所有变量都存储在栈中,无论此变量存储的值是值类型和引用类型。

2. 基类

2.1. 引用类型和值类型都继承自System.Object类

2.2. 几乎所有的引用类型都直接从System.Object继承

2.3. 值类型则继承其子类,即直接继承System.ValueType

3. 种类

3.1. 值类型

3.1.1. 结构体

3.1.1.1. struct(直接派生于System.ValueType)

3.1.1.1.1. 数据量小勇struct,数据量大用class

3.1.2. 数值类型

3.1.2.1. 整型

3.1.2.1.1. short(System.Int16),ushort(System.UInt16),int(System.Int32),uint(System.UInt32), long(System.Int64),ulong(System.UInt64), sbyte(System.SByte的别名),byte(System.Byte),

3.1.2.2. 字符型

3.1.2.2.1. char(System.Char)

3.1.2.3. 浮点型

3.1.2.3.1. float(System.Single),double(System.Double)

3.1.3. decimal型

3.1.3.1. decimal(System.Decimal)

3.1.4. bool型

3.1.5. 枚举

3.1.5.1. enum(派生于System.Enum)

3.1.6. 可空类型

3.1.6.1. 派生于System.Nullable泛型结构体,语法 T? 是 System.Nullable<T> 的简写,此处的 T 为值类型

3.2. 引用类型

3.2.1. 数组:(派生于System.Array)数组的元素,不管是引用类型还是值类型,都存储在托管堆上;

3.2.2. 类:class(派生于System.Object);

3.2.3. 接口:interface(接口不是一个“东西”,所以不存在派生于何处的问题。);

3.2.4. 委托:delegate(派生于System.Delegate);

3.2.5. object:(System.Object的别名);

3.2.6. 字符串:string(System.String的别名)。

3.2.6.1. 不可变引用类型

4. new

4.1. Class使用前必须new

4.2. struct 默认带了new,可以不适用new而直接使用,但是如果要new,则必须是有参数构造函数

5. 派生

5.1. 所有的值类型都是密封(seal)的,所以无法派生出新的值类型

5.2. 引用类型可以派生出新的类型

6. 内存分配

6.1. 值类型的实例通常是在线程栈上分配的(静态分配),但是在某些情形下可以存储在堆中。

6.2. 引用类型的对象总是在进程堆中分配(动态分配)