黑马程序员笔记--值类型与引用类型
来源:互联网 发布:字画 网络 编辑:程序博客网 时间:2024/05/17 01:34
我们先简单回顾一下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);
会发生这样的事:
- 在应用程序堆(Heap)上创建一个引用类型(Type)的实例(Instance)或者叫对象(Object),并为它分配内存地址。
- 自动传递该实例的引用给构造函数。(正因为如此,你才可以在构造函数中使用this来访问这个实例。)
- 调用该类型的构造函数。
- 返回该实例的引用(内存地址),赋值给rPoint变量。
----------Windows Phone 7手机开发、.Net培训、期待与您交流!
- 黑马程序员笔记--值类型与引用类型
- 【黑马程序员】C#笔记之值类型和引用类型
- 黑马程序员——值类型与引用类型
- 黑马程序员---值类型和引用类型
- 黑马程序员:值类型和引用类型
- 黑马程序员_学习笔记10——引用类型与值类型,继承,访问修饰符,里氏转换
- 黑马程序员—C#中值类型与引用类型
- 黑马程序员之c#学习笔记:C#值类型和引用类型区别
- 黑马程序员-值类型和引用类型、文件的操作笔记
- 黑马程序员-我的摘录-C#值类型与引用类型
- 黑马程序员------.Net基础之值类型和引用类型
- 黑马程序员--值类型和引用类型 (05)
- 黑马程序员-引用类型和值类型复习
- 黑马程序员_值类型和引用类型
- 黑马程序员-Java 值类型(基本类型)和引用类型
- 黑马程序员_C#面向对象(值类型和引用类型,构造函数,常量与静态成员,命名空间,索引)
- 引用类型与值类型
- 值类型与引用类型
- 关于TCP流模式与UDP数据报文模式区别
- TTL粗解
- TI z-stack协议栈 sampleApp分析
- 笔记:成员函数指针
- 黑马程序员——Java反射
- 黑马程序员笔记--值类型与引用类型
- 如何修改word2007作者
- 我的积分为什么是负20分
- QT源码解析 文章索引
- 详细介绍C++中重载函数的应用
- VC++对话框程序打印及打印预览的实现
- 《Linux内核修炼之道》 之 高效学习Linux驱动开发
- 原来是数据库!!
- Objective-C 学习笔记