Posted on 2007-02-12 12:30
dennis 阅读(981)
评论(0) 编辑 收藏 所属分类:
C#历程
一.C#的统一类型系统
1.C#的类型系统是统一的,java的类型系统分为:基本类型(原生类型)和类类型,而C#的所有类型直接或间接地从object类类型派生而来,从类型系统上来看比java更OO。
2.C#的类型分为三类:
(1)值类型,
一个值类型或是结构类型,或是枚举类型
(2)引用类型
(3)指针类型
值类型与引用类型的不同在于:值类型的变量直接包含其数据,而引用类型的变量存储对其数据的引用(reference),后者称为对象(object)。对于引用类型,两个变量可能引用同一个对象,因此对一个变量的操作可能影响另一个变量所引用的对象。对于值类型,每个变量都有自己的数据副本,对一个变量的操作不可能影响另一个变量。
二。值类型
1.所有值类型从类System.ValueType隐式继承,后者又从类object继承。任何类型都不可能从值类型派生。
2.所有值类型都隐式声明一个称为默认构造函数(default constructor)的公共无参数实例构造函数。默认构造函数返回一个零初始化实例,它就是该值类型的默认值(default value):·
对于所有simple-types,默认值是将其所有位都置零的位模式所形成的值:
o
对于sbyte、byte、short、ushort、int、uint、long和ulong,默认值为0。
o
对于char,默认值为'\x0000'。
o
对于float,默认值为0.0f。
o
对于double,默认值为0.0d。
o
对于decimal,默认值为0.0m。
o
对于bool,默认值为false。
·
对于enum-typeE,默认值为0。
·
对于struct-type,默认值是通过将所有值类型字段设置为它们的默认值、将所有引用类型字段设置为null而产生的值。
3.C#中有所谓的简单类型概念(simple type),类似于java的基本类型,但又不同,C#的简单类型本质上都是结构类型(预定义集合的结构类型),所以还是值类型,从
System.ValueType继承而来。C#的简单类型包括:
保留字 | 化名的类型 |
sbyte | System.SByte |
byte | System.Byte |
short | System.Int16 |
ushort | System.UInt16 |
int | System.Int32 |
uint | System.UInt32 |
long | System.Int64 |
ulong | System.UInt64 |
char | System.Char |
float | System.Single |
double | System.Double |
bool | System.Boolean |
decimal | System.Decimal |
这些简单类型都是System命名空间中预定义结构类型的别名(ruby的别名实在贴心)
4.枚举类型,
枚举类型是具有命名常量的独特的类型。每个枚举类型都有一个基础类型,该基础类型必须为
byte、sbyte、short、ushort、int、uint、long 或 ulong。如果没有为枚举类型中的元素指定基础值,默认是从0开始逐一递增。
三。引用类型
1.引用类型是类类型、接口类型、数组类型或委托类型。
2.类类型:包括预定义的类类型和用户通过class关键字的自定义类类型
3.对象类型:
object类类型是所有其他类型的最终基类。C# 中的每种类型都是直接或间接从object类类型派生的。
关键字object只是预定义类System.Object的别名。
4.string类型:
string类型是直接从object继承的密封类类型。关键字string只是预定义类System.String的别名.
5.接口类型:
与java中的接口概念基本一致,可以变相实现多重继承。
类类型 | 说明 |
System.Object | 所有其他类型的最终基类。 |
System.String | C# 语言的字符串类型。 |
System.ValueType | 所有值类型的基类。 |
System.Enum | 所有枚举类型的基类。 |
System.Array | 所有数组类型的基类。 |
System.Delegate | 所有委托类型的基类。 |
System.Exception | 所有异常类型的基类。 |
四。装箱、拆箱概念
1.装箱和拆箱的概念是C# 的类型系统的核心。它在 value-type 和 reference-type 之间的架起了一座桥梁,使得任何 value-type 的值都可以转换为 object 类型的值,反过来转换也可以。
2.装箱:装箱转换允许将value-type隐式转换为reference-type。
装箱的行为可以用下面的过程描述:
sealed class T_Box: System.ValueType
{
T value;
public T_Box(T t) {
value = t;
}
}
分配一个对象实例,然后将value-type的值复制到该实例中
3.拆箱:拆箱转换允许将reference-type显式转换为value-type。
从对象box到value-typeT的拆箱转换相当于执行表达式((T_Box)box).value