现在的位置: 首页 > 综合 > 正文

C#类型之值类型与引用类型(from MSDN,加补充)

2012年09月22日 ⁄ 综合 ⁄ 共 1824字 ⁄ 字号 评论关闭
值类型(C# 参考)

值类型主要由两类组成:

结构分为以下几类:

值类型的主要功能

基于值类型的变量直接包含值。将一个值类型变量赋给另一个值类型变量时,将复制包含的值。这与引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身。

所有的值类型均隐式派生自 System.ValueType

与引用类型不同,从值类型不可能派生出新的类型。但与引用类型相同的是,结构也可以实现接口。

与引用类型不同,值类型不可能包含 null 值。然而,可空类型功能允许将 null 赋给值类型。

每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。有关值类型默认值的信息,请参见默认值表

简单类型的主要功能

所有的简单类型(C# 语言的组成部分)均为 .NET Framework 系统类型的别名。例如,intSystem.Int32 的别名。有关完整的别名列表,请参见内置类型表(C# 参考)

编译时计算操作数均为简单类型常数的常数表达式。

可使用文字初始化简单类型。例如,“A”是 char 类型的文字,而 2001 是 int 类型的文字。

初始化值类型

C# 中的局部变量经初始化后方可使用。因此,如果像下面这样声明了一个局部变量而未将其初始化:

int myInt;

那么在将其初始化之前,无法使用此变量。可使用下列语句将其初始化:

myInt = new int();  // Invoke default constructor for int type.

此语句等效于:

myInt = 0;         // Assign an initial value, 0 in this example.

当然,可以像下面这样用同一个语句进行声明和初始化:

int myInt = new int();

- 或 -

int myInt = 0;

使用 new 运算符时,将调用特定类型的默认构造函数并对变量赋以默认值。在上例中,默认构造函数将值 0 赋给了 myInt。有关通过调用默认构造函数所赋的值的更多信息,请参见默认值表

对于用户定义的类型,使用 new 来调用默认构造函数。例如,下列语句调用了 Point 结构的默认构造函数:

Point p = new Point(); // Invoke default constructor for the struct.

此调用后,该结构被认为已被明确赋值;也就是说该结构的所有成员均已初始化为各自的默认值。

有关 new 运算符的更多信息,请参见 new

有关格式化数字类型输出的信息,请参见格式化数值结果表

补充内容:
1.
值类型一般放在栈上,

1)
如果值类型是方法内的局部变量,他会在栈上分配内存;

2) 如果是实例对象成员变量时,它会在堆上分配内存(因为实例对象,对象本身就是引用类型来(指针放在栈),保存在堆里的,所以他当中的值类型数据也是放在堆里的)

2.引用类型的指针放在栈上,实际值放在堆上

如下图参考

值类型 引用类型
变量中存放 真正的数据 指向数据的引用指针
内存空间分配 堆栈(Stack) 托管堆(Managed Heap)
内存需求 一般来说较少 较大
执行效能 较快 较慢
内存释放时间点 执行超过定义变量的作用域 由回收站负责回收
可以为null 不可 可以

抱歉!评论已关闭.