浅谈C#类型系统

开发 后端
本文介绍C#类型系统一共分为两类,一类是值类型(Value Type),一类是引用类型(Reference Type)。值类型和引用类型是以它们在计算机内存中是如何被分配的来划分的。

我们先简单回顾一下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。

1.值类型

当声明一个值类型的变量(Variable)的时候,变量本身包含了值类型的全部字段,该变量会被分配在线程堆栈(Thread Stack)上。假如我们有这样一个值类型,它代表了直线上的一点:

  1. public struct ValPoint {  
  2.     public int x;  
  3.  
  4.     public ValPoint(int x) {  
  5.        this.x = x;  
  6.     }  

2.引用类型

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

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

  1. public class RefPoint {  
  2.     public int x;  
  3.  
  4.     public RefPoint(int x) {  
  5.        this.x = x;  
  6.     }  
  7.     public RefPoint() {}  

3.关于简单类型

很多文章和书籍中在讲述这类问题的时候,总是喜欢用一个int类型作为值类型 和一个Object类型作为引用类型来作说明。本文中将采用自定义的一个 结构 和 类分别作值类型和引用类型的说明。这是因为简单类型(比如int)有一些CLR实现了的行为,这些行为会让我们对一些操作产生误解。

举个例子,如果我们想比较两个int类型是否相等,我们会通常这样:

  1. int i = 3;  
  2. int j = 3;  
  3. if(i==j) Console.WriteLine("i equals to j"); 

实际上,在后面我们就会看到,当使用“==”对引用类型变量进行比较的时候,比较的是它们是否指向的堆上同一个对象。而上面a、b指向的显然是不同的对象,只是对象包含的值相同,所以可见,对于string类型,CLR对它们的比较实际上比较的是值,而不是引用。

为了避免上面这些引起的混淆,在对象判等部分将采用自定义的结构和类来分别说明。

装箱和拆箱

这部分内容可深可浅,本文只简要地作一个回顾。简单来说,装箱 就是 将一个值类型转换成等值的引用类型。它的过程分为这样几步:
1. 在堆上为新生成的对象(该对象包含数据,对象本身没有名称)分配内存。
2. 将 堆栈上 值类型变量的值拷贝到 堆上的对象 中。
3. 将堆上创建的对象的地址返回给引用类型变量(从程序员角度看,这个变量的名称就好像堆上对象的名称一样)。
以上介绍C#类型系统

【编辑推荐】

  1. 分析C#不安全代码
  2. 浅析C#调用ImageAnimator
  3. C#连接Access、SQL Server数据库
  4. 浅谈C#固定的和活动的变量
  5. 介绍C#中的值类型
责任编辑:佚名 来源: CSDN
相关推荐

2009-08-26 15:46:01

C#匿名类型

2009-08-10 14:55:04

C#定义Nullabl

2009-08-26 14:05:19

C#值类型和引用类型

2009-08-20 18:30:33

C# ReaderWr

2011-09-21 10:56:31

C#结构

2009-08-14 17:04:50

C#类型系统

2009-08-12 11:24:25

C# String对象

2009-08-07 11:26:53

C#数组结构

2009-08-31 09:37:09

C# Employee

2009-08-19 17:12:18

C# Connecti

2009-08-20 10:24:52

C#开发WinForm

2009-09-02 15:41:21

C# HTTPWebR

2009-08-14 17:58:05

C#接口方法

2009-08-26 13:15:38

C#选择控制

2009-08-25 16:16:43

C# oledbcon

2009-02-03 09:33:26

动态类型动态编程C# 4.0

2009-08-10 10:04:25

C#抽象类C#接口

2009-08-14 10:51:43

2009-08-07 17:32:17

C#编译程序

2009-09-07 13:29:30

C#计算素数序列
点赞
收藏

51CTO技术栈公众号