📄 《_net编程先锋c#》第四章 c#类型_c#语言_网络教程.htm
字号:
布尔型<BR>布尔数据类型有true和false两个布尔值。可以赋于true或false值给一个布尔变量,或可以赋于一个表达式,其所求出的值等于两者之一:<BR>bool
bTest = (80 >
90);<BR>与C和C++相比,在C#中,true值不再为任何非零值。不要为了增加方便而把其它整型转换成布尔型。
<BR><BR>4.1.1.3 字符型<BR>字符型为一个单Unicode
字符。一个Unicode字符16位长,它可以用来表示世界上多种语言。可以按以下方法给一个字符变量赋值:<BR>char
chSomeChar =
'A';<BR>除此之外,可以通过十六进制转义符(前缀\x)或Unicode表示法给变量赋值(前缀\u):<BR>char
chSomeChar = '\x0065';<BR>char chSomeChar =
'\u0065';<BR>不存在把char转换成其它数据类型的隐式转换。这就意味着,在C#中把一个字符变量当作另外的整数数据类型看待是行不通的——这是C程序员必须改变习惯的另一个方面。但是,可以运用显式转换:<BR>char
chSomeChar = (char)65;<BR>int nSomeInt =
(int)'A';<BR>在C中仍然存在着转义符(字符含义)。要换换脑筋,请看表4.1。 <BR><BR>Table 4.1 转义符(
Escape Sequences) <BR><BR>转义符 字符名<BR>\' 单引号<BR>\" 双引号<BR>\\
反斜杠<BR>\0 空字符<BR>\a 感叹号(Alert )<BR>\b 退格<BR>\f 换页<BR>\n 新行<BR>\r
回车<BR>\t 水平 tab<BR>\v 垂直tab <BR><BR>4.1.1.4
浮点型<BR>两种数据类型被当作浮点型:float和double。它们的差别在于取值范围和精度:<BR>float: 取值范围在
1.5x10^-45~ 3.4x10^38之间, 精度为7位数。 <BR>double: 取值范围在 5.0x10^-324 ~
1.7x10^308之间, 精度为 15~16
位数。<BR>当用两种浮点型执行运算时,可以产生以下的值:<BR>正零和负零<BR>正无穷和负无穷<BR>非数字值(Not-a-Number,缩写NaN)<BR>非零值的有限数集<BR>另一个运算规则为,当表达式中的一个值是浮点型时,所有其它的类型都要被转换成浮点型才能执行运算。
<BR><BR>4.1.1.5 小数型(The decimal
Type)<BR>小数型是一种高精度、128位数据类型,它打算用于金融和货币的计算。它所表示的范围从大约1.0x10^-28 到
7.9x10^28,具有28至29位有效数字。要注意,精度是以位数 (digits)而不是以小数位(decimal
places)表示。运算准确到28个小数位的最大值。<BR>正如你所看到的,它的取值范围比double的还窄,但它更精确。因此,没有decimal和double之间的隐式转换——往一个方向转换可能会溢出,往另外一个方向可能会丢失精度。你不得不运用显式转换。<BR>当定义一个变量并赋值给它时,使用
m 后缀以表明它是一个小数型:<BR>decimal decMyValue =
1.0m;<BR>如果省略了m,在变量被赋值之前,它将被编译器认作double型。 <BR><BR>4.1.2
结构类型<BR>一个结构类型可以声明构造函数、常数、字段、方法、属性、索引、操作符和嵌套类型。尽管列出来的功能看起来象一个成熟的类,但在C#中,结构和类的区别在于结构是一个值类型,而类是一个引用类型。与C++相比,这里可以用结构关键字定义一个类。<BR>使用结构的主要思想是用于创建小型的对象,如Point和FileInfo等等。你可以节省内存,因为没有如类对象所需的那样有额外的引用产生。例如,当声明含有成千上万个对象的数组时,这会引起极大的差异。<BR>清单4.1
包含一个命名为IP的简单结构,它表示一个使用byte类型的4个字段的IP地址。我不包括方法等,因为这些工作正如使用类一样,将在下一章有详细的描述。
<BR><BR>清单4.1 定义一个简单的结构 <BR><BR>1: using System;<BR>2: <BR>3: struct
IP<BR>4: {<BR>5: public byte b1,b2,b3,b4;<BR>6: }<BR>7: <BR>8: class
Test<BR>9: {<BR>10: public static void Main()<BR>11: {<BR>12: IP
myIP;<BR>13: myIP.b1 = 192;<BR>14: myIP.b2 = 168;<BR>15: myIP.b3 =
1;<BR>16: myIP.b4 = 101;<BR>17:
Console.Write("{0}.{1}.",myIP.b1,myIP.b2);<BR>18:
Console.Write("{0}.{1}",myIP.b3,myIP.b4);<BR>19: }<BR>20: }
<BR><BR>4.1.3
枚举类型<BR>当你想声明一个由一指定常量集合组成的独特类型时,枚举类型正是你要寻觅的。最简单的形式,它看起来可能象这样:<BR>enum
MonthNames { January, February, March, April
};<BR>因我惯用缺省设置,故枚举元素是int型,且第一个元素为0值。每一个连续的元素按1递增。如果你想给第一个元素直接赋值,可以如下把它设成1:<BR>enum
MonthNames { January=1, February, March, April
};<BR>如果你想赋任意值给每个元素——甚至相同的值——这也没有问题:<BR>enum MonthNames {
January=31, February=28, March=31, April=30
};<BR>最后的选择是不同于int的数据类型。可以在一条语句中按如此赋值:<BR>enum MonthNames : byte {
January=31, February=28, March=31, April=30
};<BR>你可以使用的类型仅限于long、int、short和byte。 <BR><BR><BR>4.2
引用类型<BR>和值类型相比,引用类型不存储它们所代表的实际数据,但它们存储实际数据的引用。在C#中提供以下引用类型给你使用:<BR>·对象类型<BR>·类类
型<BR>·接口<BR>·代表元<BR>·字符串类型<BR>·数组 <BR><BR>4.2.1
对象类型<BR>对象类型是所有类型之母——它是其它类型最根本的基类。因为它是所有对象的基类,所以可把任何类型的值赋给它。例如,一个整型:<BR>object
theObj =
123;<BR>给所有的C++程序员一个警告:object并不等价于你可能正在寻找的void*。无论如何,忘掉指针总是个好主意。<BR>当一个值类型被加框(作为一个对象利用)时,对象类型就被使用了。这一章稍后会讨论到加框和消框
<BR><BR>4.2.2
类类型<BR>一个类类型可以包含数据成员、函数成员和嵌套类型。数据成员是常量、字段和事件。函数成员包括方法、属性、索引、操作符、构造函数和析构函数。类和结构的功能是非常相似的,但正如前面所述,结构是值类型而类是引用类型。<BR>和C++相比,仅允许单继承。(你不能拥有派生一个新对象的多重基类。)
但是,C#中的一个类可以派生自多重接口,该接口在下一节将得到描述。<BR>第五章
“类”专门讨论使用类编程。这一节仅打算给出C#类在哪里适合类型图的一个全貌。 <BR><BR>4.2.3
接口<BR>一个接口声明一个只有抽象成员的引用类型。跟C++中相似的概念为:一个结构的成员,且方法等于0。如果你不知道那些概念的任何东西,这里就是在C#中一个接口实际所做的。仅仅只存在着方法标志,但根本就没有执行代码。这就暗示了不能实例化一个接口,只能实例化一个派生自该接口的对象。<BR>可以在一个接口中定义方法、属性和索引。所以,对比一个类,接口有什么特殊性呢?当定义一个类时,可以派生自多重接口,而你只能可以从仅有的一个类派生。<BR>你可能会问:"OK,但我必须实现所有的接口成员,那么我能从这个途径得到什么呢?"
我想举一个来自.NET的例子:很多类实现了IDictionary 接口。你可以使用简单的类型转换访问接口:<BR>IDictionary
myDict =
(IDictionary)someobjectthatsupportsit;<BR>现在你的代码可以访问字典了。可等等,我说很多类可以实现这个接口——所以,你可以在多个地方重用代码来访问IDictionary
接口!一旦学会,任何地方都可使用。<BR>当你决定在类设计中使用接口时,学习更多关于面向对象的设计是个好主意。这本书不能教你这些概念,但你可以学习如何创建接口。以下的代码段定义接口IFace,它只有一个方法:<BR>interface
IFace<BR>{<BR>void
ShowMyFace();<BR>}<BR>正如我所提到的,不能从这个定义实例化一个对象,但可以从它派生一个类。因此,该类必须实现ShowMyFace抽象方法:<BR>class
CFace:IFace<BR>{<BR>public void
ShowMyFace()<BR>{<BR>Console.WriteLine("implementation");<BR>} <BR>}
<BR><BR>接口成员和类成员的区别在于,接口成员不能被实现。因此,我不想在下一章中再次提到这一点。 <BR><BR>4.2.4
代表元<BR>一个代表元封装了具有一些标志的一个方法。基本上,代表元是类型安全和函数指针的安全版本(回调功能)。可以同时在一个代表元实例中同时封装静态和实例方法。<BR>尽管你可以用代表员当作具有方法,但它们的主要用途是拥有有一个类事件。再次,我想把你引到下一章,那里会详细地讨论类。<BR>4.2.5
字符串类型<BR>C程序员可能会诧异,但当然,C#有一个用于操作字符串数据的基本字符串类型。字符串类直接派生自对象,且它是被密封的,这意味着再不能从它派生类。就象其它类型,字符串是预定义类System
String的一个别名。<BR>它的用法十分简单:<BR>string myString = "some
text";<BR>合并字符串同样简单:<BR>string myString = "some text" + " and a bit
more";<BR>而如果你想访问单个字符,所要做的就是访问下标:<BR>char chFirst =
myString[0];<BR>当比较两个字符串是否相等时,简单地使用"=="比较操作符。<BR>if (myString ==
yourString)
...<BR>我只不过想提到,尽管字符串是一个引用类型,比较时是比较值,而不是比较引用(内存地址)。<BR>字符串类型几乎用于这本书的每一个例子中,而且在这些例程中,我会介绍给你一些由字符串对象所显露的极其有趣的方法。<BR>4.2.6
数组<BR>一个数组包含有通过计算下标访问的变量。所有包含于数组中且被当作元素的变量必须是同一类型。这种类型自然被称为"数组类型"。数组可以存储整数对象、字符串对象或者
你提出的任何对象。<BR>数组的维数就是所谓的排(rank),它决定了相关数组元素的下标数。最常用的数组是一维数组(第一排)。一个多维数组具有的排数大于1
。每个维的下标始于0,终于维的长度减1 。<BR>应有足够的理论支持。让我们看一下用一个数组初始化器( array
initializer)初始化的数组:<BR>string[] arrLanguages = { "C", "C++", "C#"
};<BR>该简写效果等同以下:<BR>arrLanguages[0]="C"; arrLanguages[1]="C++";
arrLanguages[2]="C#";<BR>而编译器为你做了所有的工作。当然,它将同样为多维数组初始化器工作:<BR>int[,]
arr = {{0,1}, {2,3}, {4,5}};<BR>它是以下的简写:<BR>arr[0,0] = 0; arr[0,1] =
1;<BR>arr[1,0] = 2; arr[1,1] = 3;<BR>arr[2,0] = 4; arr[2,1] =
5;<BR>如果你不想事先初始化一个数组,但知道了它的大小,该声明就象这样:<BR>int[,] myArr = new
int[5,3];<BR>如果数组的大小必须动态地被计算,用于数组创建的语句可以象这样写:<BR>int nVar =
5;<BR>int[] arrToo = new
int[nVar];<BR>正如我在这一节开始所陈述的,你可以往数组里面塞任何东西,只要所有的元素类型都相同。因此,如果你想把任何东西放进一个数组,就声明它的类型为对象:
<BR><BR>4.3
加框和消框<BR>这一章的课程中,我已经给出了各式各样的值类型和引用类型。由于速度的原因,你会使用值类型——它除了占据一定空间的内存块外,就没有什么了。但是,有时对象的方便性就象值类型一样好用。<BR>这就是加框和消框登上了舞台的地方,加框和消框是C#类型系统的核心概念。通过允许一个值类型转换成类型对象或从类型对象转换成值类型,这种机制形成了值类型和引用类型之间的捆绑连接。任何东西终究是一个对象——但是,仅当需要它们是对象时。<BR>4.3.1
加框转换<BR>给一个值加框指隐式地把任何值类型转换成类型对象。当一个值类型被加框时,一个对象实例就被分配,且值类型的值被拷贝给新的对象。<BR>看以下例子:<BR>int
nFunny = 2000;<BR>object oFunny =
nFunny;<BR>第二行的赋值暗示调用一个加框操作。nFunny整型变量的值被拷贝给oFunny对象。现在整型变量和对象变量都同时存在于栈中,但对象的值居留在堆中。<BR>那么,它暗示着什么呢?它们的值互相独立——在它们之间没有连接。(oFunny没有引用nFunny的值。)
以下代码说明了结果:<BR>int nFunny = 2000;<BR>object oFunny =
nFunny;<BR>oFunny = 2001;<BR>Console.WriteLine("{0} {1}", nFunny,
oFunny);<BR>当代码改变oFunny的值时,nFunny的值并没有改变。只要你脑袋中有这个copy动作,就能够使用值类型的对象功能,发挥出你的巨大优势!<BR>4.3.2
消框转换<BR>和加框相比,消框是显式操作——必须告诉编译器,你想从对象中抽取出哪一种值类型。当执行消框操作时,C#检测所请求的值类型实际上存储在对象实例中。经过成功的校验,该值被消框。
<BR><BR>这就是消框如何执行:<BR>int nFunny = 2000;<BR>object oFunny =
nFunny;<BR>int nNotSoFunny = (int)oFunny;
<BR><BR>如果错误地请求一个double值<BR>double nNotSoFunny =
(double)oFunny;<BR>通用语言运行时(Common Language
Runtime,简写CLR)将会引发一个InvalidCastException异常。你可以在第7章 "异常处理"
中学到更多有关异常处理的知识。 <BR><BR>4.4
小结<BR>在这一章中,你学到了C#中用到的各种类型。简单的值类型包括整型、布尔型、浮点型和小数型。你会非常经常地用到一些类型,进行数学和金融的计算,还有逻辑表达。<BR>在介绍引用类型之前,我显示了一个看起来象类的结构类型。它几乎如一个类般地运作,但它只是一个值类型,这使它更加适合需要有大量的小对象的场合。<BR>引用类型起始于所有对象之母的objedt本身。object是C#中所有对象的基类,且它同样用于值类型的加框和消框。除此之外,我还让你领略了代表元、字符串和数组。<BR>令C#程序员十分神气的类型就是类。它是C#面向对象编程的心脏,下一章整章专门让你迅速理解这个激动人心且功能强大的类型。<BR><BR></TD></TR>
<TR>
<TD vAlign=top align=justify>
<DIV class=adsense id=ad003>
<P> </P></DIV></TD></TR>
<TR>
<TD colSpan=3 height=12>
<LI>上一篇文章: <A class=LinkPrevArticle
title="文章标题:《.net编程先锋C#》第五章 类 作 者:佚名 更新时间:2006-5-8 14:35:32"
href="http://www.qostudy.org/pr/Article/aspnet/c/200605/16915.html">《.net编程先锋C#》第五章 类</A><BR>
<LI>下一篇文章: <A class=LinkNextArticle
title="文章标题:《.net编程先锋C#》第三章 第一个C#应用程序 作 者:佚名 更新时间:2006-5-8 14:35:33"
href="http://www.qostudy.org/pr/Article/aspnet/c/200605/16917.html">《.net编程先锋C#》第三章 第一个C#应用程序</A></LI></TD></TR></TBODY></TABLE></DIV></TD></TR>
<TR>
<TD width="100%">
<P align=right> </P></TD></TR></TBODY></TABLE>
<SCRIPT src="《_net编程先锋C#》第四章 C#类型_C#语言_网络教程.files/count.htm"
type=text/javascript></SCRIPT>
<TABLE style="BORDER-COLLAPSE: collapse" height=55 cellPadding=0 width=760
border=0>
<TBODY>
<TR>
<TD vAlign=bottom height=26>
<P align=left>Copyright Qostudy© 2002-2006 All Rights Reserved
网络教程</P></TD></TR>
<TR>
<TD
style="BORDER-TOP: #a43232 1px solid; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px">
<P align=left>电信备案许可证 京ICP备02003422号 <A
href="http://www.qostudy.org/pr/sitemap/Article1.htm">SiteMap</A>
<SCRIPT language=javascript
src="《_net编程先锋C#》第四章 C#类型_C#语言_网络教程.files/366882.js"
type=text/javascript></SCRIPT>
<NOSCRIPT><A href="http://www.51.la/?366882" target=_blank><IMG
style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none"
alt=我要啦免费统计
src="《_net编程先锋C#》第四章 C#类型_C#语言_网络教程.files/s.htm"></A></NOSCRIPT></P></TD></TR></TBODY></TABLE><!-- Powered by: PowerEasy 2005 --></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -