黑马程序员笔记--值类型与引用类型

  Windows Phone 7手机开发、.Net培训、期待与您交流!

 

 

 

 

         我们先简单回顾一下C#中的类型系统。C# 中的类型一共分为两类,一类是值类型(Value Type),一类是引用类型(Reference Type)。值类型 和 引用类型是以它们在计算机内存中是如何被分配的来划分的。值类型包括 结构和枚举,引用类型包括类、接口、委托 等。还有一种特殊的值类型,称为简单类型(Simple Type),比如 byte,int等,这些简单类型实际上是FCL类库类型的别名,比如声明一个int类型,实际上是声明一个System.Int32结构类型。因此,在Int32类型中定义的操作,都可以应用在int类型上,比如 “123.Equals(2)”。

所有的 值类型 都隐式地继承自 System.ValueType类型(注意System.ValueType本身是一个类类型),System.ValueType和所有的引用类型都继承自 System.Object基类。你不能显示地让结构继承一个类,因为C#不支持多重继承,而结构已经隐式继承自ValueType。

注意:堆栈(stack)是一种后进先出的数据结构,在内存中,变量会被分配在堆栈上来进行操作。堆(heap)是用于为类型实例(对象)分配空间的内存区域,在堆上创建一个对象,会将对象的地址传给堆栈上的变量(反过来叫变量指向此对象,或者变量引用此对象)。

1.值类型

当声明一个值类型的变量(Variable)的时候,变量本身包含了值类型的全部字段,该变量会被分配在线程堆栈(Thread Stack)上。

假如我们有这样一个值类型,它代表了直线上的一点:

public struct ValPoint {
    public int x;

    public ValPoint(int x) {
       this.x = x;
    }
}

当我们在程序中写下这样的一条变量的声明语句时:

ValPoint vPoint1;

实际产生的效果是声明了vPoint1变量,变量本身包含了值类型的所有字段(即你想要的所有数据)。

 

2.引用类型

当声明一个引用类型变量的时候,该引用类型的变量会被分配到堆栈上,这个变量将用于保存位于堆上的该引用类型的实例的内存地址,变量本身不包含对象的数据。此时,如果仅仅声明这样一个变量,由于在堆上还没有创建类型的实例,因此,变量值为null,意思是不指向任何类型实例(堆上的对象)。对于变量的类型声明,用于限制此变量可以保存的类型。

如果我们有一个这样的类,它依然代表直线上的一点:

public class RefPoint {
    public int x;

    public RefPoint(int x) {
       this.x = x;
    }
    public RefPoint() {}
}

当我们仅仅写下一条声明语句:

RefPoint rPoint1;

它的效果就向下图一样,仅仅在堆栈上创建一个不包含任何数据,也不指向任何对象(不包含创建再堆上的对象的地址)的变量。

而当我们使用new操作符时:

rPoint1= new RefPoint(1);

会发生这样的事:

  1. 在应用程序堆(Heap)上创建一个引用类型(Type)的实例(Instance)或者叫对象(Object),并为它分配内存地址。
  2. 自动传递该实例的引用给构造函数。(正因为如此,你才可以在构造函数中使用this来访问这个实例。)
  3. 调用该类型的构造函数。
  4. 返回该实例的引用(内存地址),赋值给rPoint变量。

 

----------Windows Phone 7手机开发、.Net培训、期待与您交流!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值