设为首页
加入收藏
联系我们
首页 基础教程 技术文档 实例分析 数 据 库 疑难杂症 ASP.NET 七夕许愿树 技术论坛
最新文章
  .NET上传图片加文字…
 在vs.net bate…
 C#中利用正则表达式实现…
 Visual C#的SQ…
 关于使用存储过程创建分页
 通用分页显示查询存储过程
 大数据量的分页
 什么是web.confi…
 ASP.NET 配置文件…
 对“三层结构”的深入理解…
 多个关键字的查询问题
 VB和C# 语法对比图 …
 C#基础全接触
 用C#压缩和修复Acce…
 C#中的类型相等与恒等(…
推荐文章
 关于C#中的REF和黓认…
 读书笔记c#高级编程 委…
 【算法】C#快速排序类
 Visual C#的SQ…
 C#中调用API
 Infragistics…
 C#接口转换
 C#读取设备信息
 用.net操作word
 C# MessageBo…
 Visual C#中的数…
 雅虎公司C#笔试题,看看…
 C#.NET使用NHib…
 .net学习之运算符重载…
 Visual C# 3.…
热门文章
 ADO.Net与ADO在…
 开发ASP.NET下的M…
 用C#+XMI技术进行U…
 什么是虚拟机?
 C#基础全接触
 C#中利用正则表达式实现…
 雅虎公司C#笔试题,看看…
 用Visual C# 2…
 C#学习第一天
 C#语言初级入门(1)
 VB和C# 语法对比图 …
 远程重启计算机(C#)
 什么是B/S三层?
 Visual C#的SQ…
 Visual C#常用函…
C#学习第五天
阅读正文 文字大小:增大 减小  文字行距:增大 减小   双击自动滚屏
本文由中国C#技术学习中心整理  如果你对本文有不明之处请到技术论坛讨论!

第四章 C#类型

既然你知道了怎样创建一个简单的C#程序,我将会给你介绍C#的类型系统.在这一章中,你学到如何使用不同的值和引用类型,加框和消框机制能为你作些什么.尽管这一章的不侧重于例子,但你可以学到很多重要的信息,关于如何创建现成类型的程序.

4.1 值类型

各种值类型总是含有相应该类型的一个值.C#迫使你初始化变量才能使用它们进行计算-变量没有初始化不会出问题,因为当你企图使用它们时,编译器会告诉你. 每当把一个值赋给一个值类型时,该值实际上被拷贝了.相比,对于引用类型,仅是引用被拷贝了,而实际的值仍然保留在相同的内存位置,但现在有两个对象指向了它(引用它).C#的值类型可以归类如下:
·简单类型(Simple types )
·结构类型(struct types)
·枚举类型(Enumeration types)

4.1.1 简单类型

在C#中出现的简单类型共享一些特性.第一,它们都是.NET系统类型的别名.第二,由简单类型组成的常量表达式仅在编译时而不是运行时受检测.最后,简单类型可以按字面被初始化.以下为C#简单类型归类:
·整型
·布尔型
·字符型 ( 整型的一种特殊情况 )
·浮点型
·小数型

4.1.1.1 整型
C#中有9个整型. sbyte 、byte、 short、 ushort、 int、 uint、 long、 ulong 和 char(单独一节讨论).它们具有以下特性:

·sbyte型为有符号8位整数,取值范围在128~127之间.
·bytet型为无符号16位整数,取值范围在0~255之间.
·short型为有符号16位整数,取值范围在-32,768~32,767之间.
·ushort型为无符号16位整数,取值范围在0~65,535之间.
·int型为有符号32位整数,取值范围在-2,147,483,648~ 2,147,483,647之间.
·uint型为无符号32位整数,取值范围在 0 ~ 4,294,967,295之间.
·long型为64位有符号整数,取值范围在9,223,372,036,854,775,808~ 9,223,372,036,854,775,807之间.
·ulong型为64位无符号整数,取值范围在0 ~ 18,446,744,073,709,551,615之间.

VB和C程序员都可能会对int和long数据类型所代表的新范围感到惊讶.和其它的编程语言相比,在C#中,int不再取决于一个机器的字(word )的大??a href=/cs/csharp/getkey.php?key=long target=_blank class=cs_key>long被设成64位.

4.1.1.2 布尔型

布尔数据类型有true和false两个布尔值.可以赋于true或false值给一个布尔变量,或可以赋于一个表达式,其所求出的值等于两者之一:
bool bTest = ( 80 > 90 );
与C和C++相比,在C#中,true值不再为任何非零值.不要为了增加方便而把其它整型转换成布尔型.

4.1.1.3 字符型

字符型为一个单Unicode 字符.一个Unicode字符16位长,它可以用来表示世界上多种语言.可以按以下方法给一个字符变量赋值:
char chSomeChar = 'A';
除此之外,可以通过十六进制转义符(前缀\x)或Unicode表示法给变量赋值(前缀\u):
char chSomeChar = '\x0065';
char chSomeChar = '\u0065';
不存在把char转换成其它数据类型的隐式转换.这就意味着,在C#中把一个字符变量当作另外的整数数据类型看待是行不通的——这是C程序员必须改变习惯的另一个方面.但是,可以运用显式转换:
char chSomeChar = ( char )65;
int nSomeInt = ( int )'A';
在C中仍然存在着转义符(字符含义).要换换脑筋,请看表4.1.

Table 4.1 转义符( Escape Sequences)

转义符 字符名
\' 单引号
\" 双引号
\\ 反斜杠
\0 空字符
\a 感叹号(Alert )
\b 退格
\f 换页
\n 新行
\r 回车
\t 水平 tab
\v 垂直tab

4.1.1.4 浮点型

两种数据类型被当作浮点型:float和double.它们的差别在于取值范围和精度:
float: 取值范围在 1.5x10^-45~ 3.4x10^38之间, 精度为7位数.
double: 取值范围在 5.0x10^-324 ~ 1.7x10^308之间, 精度为 15~16 位数.
当用两种浮点型执行运算时,可以产生以下的值:
正零和负零
正无穷和负无穷
非数字值(Not-a-Number,缩写NaN)
非零值的有限数集
另一个运算规则为,当表达式中的一个值是浮点型时,所有其它的类型都要被转换成浮点型才能执行运算.

4.1.1.5 小数型(The decimal Type )

小数型是一种高精度、128位数据类型,它打算用于金融和货币的计算.它所表示的范围从大约1.0x10^-28 到 7.9x10^28,具有28至29位有效数字.要注意,精度是以位数 ( digits )而不是以小数位(decimal places )表示.运算准确到28个小数位的最大值.

正如你所看到的,它的取值范围比double的还窄,但它更精确.因此,没有decimal和double之间的隐式转换——往一个方向转换可能会溢出,往另外一个方向可能会丢失精度.你不得不运用显式转换.

当定义一个变量并赋值给它时,使用 m 后缀以表明它是一个小数型:
decimal decMyValue = 1.0m;
如果省略了m,在变量被赋值之前,它将被编译器认作double型.

4.1.2 结构类型

一个结构类型可以声明构造函数、常数、字段、方法、属性、索引、操作符和嵌套类型.尽管列出来的功能看起来象一个成熟的类,但在C#中,结构和类的区别在于结构是一个值类型,而类是一个引用类型.与C++相比,这里可以用结构关键字定义一个类.

使用结构的主要思想是用于创建小型的对象,如Point和FileInfo等等.你可以节省内存,因为没有如类对象所需的那样有额外的引用产生.例如,当声明含有成千上万个对象的数组时,这会引起极大的差异.

清单4.1 包含一个命名为IP的简单结构,它表示一个使用byte类型的4个字段的IP地址.我不包括方法等,因为这些工作正如使用类一样,将在下一章有详细的描述.

清单4.1 定义一个简单的结构

1: using System;
2:
3: struct IP
4: {
    5: public byte b1,b2,b3,b4;
    6: }
7:
8: class Test
9: {
    10: public static void Main( )
    11: {
        12: IP myIP;
        13: myIP.b1 = 192;
        14: myIP.b2 = 168;
        15: myIP.b3 = 1;
        16: myIP.b4 = 101;
        17: Console.Write( "{0}.{1}.",myIP.b1,myIP.b2 );
        18: Console.Write( "{0}.{1}",myIP.b3,myIP.b4 );
        19: }
    20: }
4.1.3 枚举类型

当你想声明一个由一指定常量集合组成的独特类型时,枚举类型正是你要寻觅的.最简单的形式,它看起来可能象这样:
enum MonthNames { January, February, March, April };

因我惯用缺省设置,故枚举元素是int型,且第一个元素为0值.每一个连续的元素按1递增.如果你想给第一个元素直接赋值,可以如下把它设成1:
enum MonthNames { January=1, February, March, April };

如果你想赋任意值给每个元素——甚至相同的值——这也没有问题:
enum MonthNames { January=31, February=28, March=31, April=30 };

最后的选择是不同于int的数据类型.可以在一条语句中按如此赋值:
enum MonthNames : byte { January=31, February=28, March=31, April=30 };
你可以使用的类型仅限于long、int、short和byte.

本文由中国C#技术学习中心整理  如果你对本文有不明之处请到技术论坛讨论!

中国C#技术交流QQ群:6337034  10976424  9383681  35248582  35248645
版权所有:中国C#技术学习中心 Copyright © 20010-20012
建议浏览分辨率使用:1024*768分辨率
粤ICP备05002251号