4.C#基础之类型(完成)

     第一章简介中提到过,C#语言类型分为两大类:值类型和引用类型,其实还有第三类——指针,但只能用在不安全代码中,这里就下不说它。下面我们详细说说这两大类。

  4.1值类型

     从上面这个图,值类型不是结构类型,就是枚举类型;C#又提供了一个称为"简单类型"的预定义的结构类型集;之后又细分。任何类型都不可能从值类型派生,所以值类型都是隐式密封的。

   4.1.1 默认构造函数

     所有值类型都隐式声明一个称为默认构造函数的公共无参数实例构造函数,因此一个结构类型中不可能包含一个关于无参数构造函数的显式声明,但允许结构类型声明参数化实例构造行数。默认构造函数返回一个零初始化实例,它就是该值类型的默认值。

       对于所有简单类型,默认值是将其所有位都置零的位模式所形成的值:

       对于枚举类型Enum,默认值是零;

       对于结构类型,值类型设置为它们的默认值,引用类型设置为null。

   4.1.2 简单类型

     结构类型也是一种值类型,但不在这章细说;简单类型通过保留字来表示,而这些保留字知识System命名空间中预定义的结构类型的别名:

     由于简单类型是结构类型的别名,所以每个简单类型都具有成员,比如:int i= int.MaxValue;   string s=i.ToString();等;简单类型只是结构类型的其中一种,简单类型同其他结构类型的不同之处就在于:简单类型允许某些附加的操作。这些骚操作就是:

         1.大多数简单类型允许通过编写文本来创建值,C#没有普遍的为其他结构类型设置类似以文本创建值,所以总是通过实例构造函数来创建;

         2.当表达式的操作数都是简单类型时,编译器可以在编译时计算,这样的表达式称为常数表达式,涉及到其他结构类型的表达式不被视为常数表达式;

         3.通过const声明可以声明简单类型的常数,常数不可能属于其他结构类型,但static readonly字段提供了类似的效果;

         4.涉及简单类型的转化可以参与由其他结构类型定义的转换运算符的计算,但用户定义的转化运算符不能参与其他用户定义运算符的计算。

   4.1.3 整型

     C#支持9种整型:sbyte,byte,short,ushort,int,uint,long,ulong和char。

     整型一元运算符和二元运算符总是对有符号32位精度、无符号32位精度、有符号64位精度或无符号64位精度进行操作。

     char类型按分类归属为整型类别,但它在以下两个方面不同于其他整型:

       1.不存在从其他类型到char类型的隐式转换;

       2.char类型的常数必须写成字符或写成强制性转化为类型char的整数,比如:char(10)与'\x000A'相同。

   4.1.4 浮点型

     C#支持两种浮点型:float和double,用32位单精度和64位单精度IEEE754格式来表示,这些格式提供了以下几组值:

     如果二元运算符的一个操作数是浮点型,另一个操作数必须是整型或浮点型,运算时把整型转化成对应的浮点型,结果也是浮点型。浮点运算符(包括赋值运算)从来不产生异常。相反,在异常情况下,浮点运算产生零、无穷大或NaN:

   4.1.5 decimal类型

     decimal类型是适合财务和货币计算的128位数据类型,decimal类型可以表达具有28或29个有效数字。与float和double数据类型相反,十进制小数数字可以精确地用decimal表示形式来表示。

     如果二元运算符的一个操作数是decimal类型,另一个必须为整型或decimal类型,在执行运算前转化为decimal。decimal类型值的运算结果是这样的出来的:先计算一个精确结果(按每个运算符的定义保留小数位数),然后舍入以适合表示形式,结果舍入到最接近的可表示值,当结果同样地接近于两个可表示值时,舍入到最小有效数位置中为偶数的值(这被称为"银行家舍入法")。

     于浮点型相比,decimal类型具有较高的精度,但取值范围小,因此从浮点型到decimal的转化可能会产生溢出异常,而从decimal到浮点型的转化则可能精度损失。因为这些,它们之间不存在隐式转化,所以若果没有显示的强制转化,就不可能在同一表达式中同时使用浮点数和decimal操作数。

   4.1.6 bool类型

     bool类型的可能值为true和false。它和其他类型之间不存在标准转化,不能用bool值代替整数值,反之亦然。

   4.1.7 枚举类型

     枚举类型是具有命名常数的独特类型。每个枚举类型都具有一个基础类型,这必须是整型中的一种。枚举类型的值并不仅限于哪些命名常数的值。

  4.2引用类型

     引用类型:是类类型、接口类型、数组类型或委托类型。它是对该类型的某个实例的一个引用。null值适用所有引用类型,表示"没有被引用的实例"。

   4.2.1 类类型

     类类型定义了包含数据成员、函数成员和嵌套类型的数据结构,其中数据成员包括常数和字段,函数成员包括方法、属性、事件、索引器、运算器、实例构造函数、析构函数和静态构造函数。类类型支持继承。

     对象类型:object类类型是所有其他类型的最终基类,C#每种类型都是直接或间接从它派生出来的。关键词object预定义类只是System.Object的别名;

     string类型:是直接从object继承的密封类类型,string类的实例表示Unicode字符串,关键词string预定义类只是System.String的别名。

   4.2.2 接口类型

     一个接口定义一个协定,实现接口的类或结构必须遵守其协定。一个接口可以继承多个接口,一个类或结构可以实现多个接口。

   4.2.3 数组类型

     数组是一种数据结构,它包含可通过计算索引访问的零个或多个变量,数组中包含的元素又称数组的元素。

   4.2.6 委托类型

     委托是一种数据结构,它引用一个或多个方法,对于实例方法,还引用这些方法所对应的对象实例。在C或C++中类似函数指针,但函数指针只能引用静态函数,而委托既可以引用静态方法,还可以引用实例方法。

     在引用实例方法中,委托不仅存储了一个对该方法入口点的引用,还存储了一个相应对象实例的引用,该方法就是通过对象实例被调用。

  4.3装箱和拆箱

     装箱和拆箱的概念是C#类型系统的核心,它使得值类型和引用类型可以互相转换,所以任何类型的值最终都可以按对象处理。

     装箱允许将"值类型"隐式转化为"引用类型",存在下列装箱转换:

     拆箱允许将引用类型显式转化为值类型,存在以下转化:

posted @ 2018-12-05 12:28  狂风过境的风  阅读(152)  评论(0编辑  收藏  举报