100165821.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 248 行 · 第 1/3 页
HTM
248 行
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
5.2 类型的安全性
</title></head>
<body>
<div class="area">
<div class="col1">
<div class="lineBlue">
</div>
<!-- title -->
<div class="arcTitle">
<h1>
<a href="../16">
C#高级编程(第3版)【全文连载】
</a>
</h1>
<div style="text-align: center; font-size: 15px">
<a href="100165821.htm">
5.2 类型的安全性
</a>
</div>
<div style="text-align: center; font-size: 15px">
<a class="url" href="../../default.htm">http://book.csdn.net/</a>
2006-10-13 14:50:00
</div>
<div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
<div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
图书导读
</div>
<div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
<!--导读-->
<h1 id="divCurrentNode" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165821.htm'><font color='red'>5.2 类型的安全性</font></a></h1>
<div id="divRelateNode" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100165818.htm'>4.3 修饰符</a></div><div style='float:right;width:49%'>·<a href='100165819.htm'>4.4 接口</a></div><div style='float:left;width:49%'>·<a href='100165820.htm'>5.1 运算符</a></div><div style='float:right;width:49%'>·<a href='100165822.htm'>5.3 对象的相等比较</a></div><div style='float:left;width:49%'>·<a href='100165823.htm'>5.4 运算符重载</a></div><div style='float:right;width:49%'>·<a href='100165824.htm'>5.5 用户定义的数据类型转换</a></div></div>
</div>
</div>
</div>
<!-- main -->
<div id="main">
<div id="text"> <link href="css.css" rel="stylesheet" type="text/css" /><p class="MsoNormal"><span style="FONT-FAMILY: 宋体">第</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体">章提到中间语言</span><span lang="EN-US">(IL)</span><span style="FONT-FAMILY: 宋体">可以对其代码强制加上强类型安全性。强类型支持</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">提供的许多服务,包括安全性和语言的交互性。因为</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">这种语言将编译为</span><span lang="EN-US">IL</span><span style="FONT-FAMILY: 宋体">,所以</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">也是强类型的。这说明数据类型并不总是可互换的。本节将介绍基本类型之间的转换。</span></p>
<p class="a3" style="MARGIN-TOP: 8.15pt; TEXT-INDENT: 21.45pt"><span style="FONT-FAMILY: 黑体">注意:</span></p>
<p class="a1" style="MARGIN-BOTTOM: 8.15pt; TEXT-INDENT: 21.45pt"><span lang="EN-US">C#</span><span style="FONT-FAMILY: 楷体_GB2312">还支持在不同引用类型之间的转换,允许指定自己创建的数据类型如何与其他类型进行相互转换。这些论题将在本章后面讨论。</span></p>
<h3 style="MARGIN: 8.15pt 0cm"><span lang="EN-US">5.2.1 </span><span style="FONT-FAMILY: 黑体">类型转换</span></h3>
<p class="MsoToc1" style="LINE-HEIGHT: 15pt"><span><span style="FONT-FAMILY: 宋体">我们常常需要把数据从一种类型转换为另一种类型。考虑下面的代码:</span></span></p>
<p class="2" style="MARGIN: 8.15pt 0cm 0pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">byte value1 = 10;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 13.5pt"><span lang="EN-US">byte value2 = 23;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 13.5pt"><span lang="EN-US">byte total;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 13.5pt"><span lang="EN-US">total = value1 + value2;</span></p>
<p class="2" style="MARGIN: 0cm 0cm 8.15pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">Console.WriteLine(total);</span></p>
<p class="MsoToc1" style="LINE-HEIGHT: 15pt"><span style="FONT-FAMILY: 宋体">在编译这些代码时,会产生一个错误:</span></p>
<p class="a6" style="MARGIN: 8.15pt 0cm 8.15pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">Cannot implicitly convert type 'int' to 'byte' (</span><span style="FONT-FAMILY: 宋体">不能把</span><span lang="EN-US">int</span><span style="FONT-FAMILY: 宋体">类型隐式地转换为</span><span lang="EN-US">byte</span><span style="FONT-FAMILY: 宋体">类型</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 15pt"><span style="FONT-FAMILY: 宋体">问题是,我们把两个</span><span lang="EN-US">byte</span><span style="FONT-FAMILY: 宋体">加在一起时,应返回</span><span lang="EN-US">int</span><span style="FONT-FAMILY: 宋体">型结果,而不是另一个</span><span lang="EN-US">byte</span><span style="FONT-FAMILY: 宋体">。这是因为</span><span lang="EN-US">byte</span><span style="FONT-FAMILY: 宋体">包含的数据只能为</span><span lang="EN-US">8</span><span style="FONT-FAMILY: 宋体">位,所以把两个</span><span lang="EN-US">byte</span><span style="FONT-FAMILY: 宋体">加在一起很容易得到不能存储在一个</span><span lang="EN-US">byte</span><span style="FONT-FAMILY: 宋体">中的值。如果要把结果存储在一个</span><span lang="EN-US">byte</span><span style="FONT-FAMILY: 宋体">变量中,就必须把它转换回</span><span lang="EN-US">byte</span><span style="FONT-FAMILY: 宋体">。有两种转换方式,隐式转换方式和显式转换方式。</span></p>
<h4 style="TEXT-INDENT: 21.45pt"><span lang="EN-US">1. </span><span style="FONT-FAMILY: 黑体">隐式转换方式</span></h4>
<p class="MsoNormal" style="LINE-HEIGHT: 15pt"><span style="FONT-FAMILY: 宋体">如果能保证值不会发生任何变化,类型转换就可以自动进行。这就是前面代码失败的原因:试图从</span><span lang="EN-US">int</span><span style="FONT-FAMILY: 宋体">转换为</span><span lang="EN-US">byte</span><span style="FONT-FAMILY: 宋体">,而潜在地丢失了</span><span lang="EN-US">3</span><span style="FONT-FAMILY: 宋体">个字节的数据。编译器不会告诉我们该怎么做,除非我们显式地告诉它这就是我们希望的!如果在</span><span lang="EN-US">long</span><span style="FONT-FAMILY: 宋体">型变量中存储结果,而不是</span><span lang="EN-US">byte</span><span style="FONT-FAMILY: 宋体">型变量中,就不会有问题了:</span></p>
<p class="a6" style="MARGIN: 8.15pt 0cm 0pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">byte value1 = 10;</span></p>
<p class="a6" style="MARGIN: 0cm 0cm 6pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">byte value2 = 23;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">long total; // this will compile fine</span></p>
<p class="a6" style="MARGIN: 6pt 0cm 0pt 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 13pt"><span lang="EN-US">total = value1 + value2;</span></p>
<p class="a6" style="MARGIN: 0cm 0cm 8.15pt 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 13pt"><span lang="EN-US">Console.WriteLine(total);</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 15pt"><span style="FONT-FAMILY: 宋体">这是因为</span><span lang="EN-US">long</span><span style="FONT-FAMILY: 宋体">型变量包含的数据字节比</span><span lang="EN-US">int</span><span style="FONT-FAMILY: 宋体">型多,所以数据没有丢失的危险。在这些情况下,编译器会很顺利地进行转换,我们也不需要显式提出要求。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 15pt"><span style="FONT-FAMILY: 宋体">表</span><span lang="EN-US">5-4</span><span style="FONT-FAMILY: 宋体">介绍了</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">支持的隐式类型转换。</span></p>
<p class="a5" style="MARGIN-TOP: 1pt"><span style="FONT-FAMILY: 黑体">表</span><span lang="EN-US"> 5-4</span></p>
<div align="center">
<table class="MsoNormalTable" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1">
<tbody>
<tr>
<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 9.9pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 9.9pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 117.2pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="156">
<p class="a2" style="LINE-HEIGHT: 13.5pt"><span style="FONT-FAMILY: 黑体">源</span><span style="FONT-FAMILY: 'Times New Roman'"> </span><span style="FONT-FAMILY: 黑体">类</span><span style="FONT-FAMILY: 'Times New Roman'"> </span><span style="FONT-FAMILY: 黑体">型</span></p>
</td>
<td style="BORDER-RIGHT: medium none; PADDING-RIGHT: 9.9pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 9.9pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 326.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="435">
<p class="a2" style="LINE-HEIGHT: 13.5pt"><span style="FONT-FAMILY: 黑体">目</span><span style="FONT-FAMILY: 'Times New Roman'"> </span><span style="FONT-FAMILY: 黑体">的</span><span style="FONT-FAMILY: 'Times New Roman'"> </span><span style="FONT-FAMILY: 黑体">类</span><span style="FONT-FAMILY: 'Times New Roman'"> </span><span style="FONT-FAMILY: 黑体">型</span></p>
</td>
</tr>
<tr>
<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 9.9pt; BORDER-TOP: medium none; PADDING-LEFT: 9.9pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 117.2pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="156">
<p class="a4" style="MARGIN-LEFT: 10.7pt; LINE-HEIGHT: 13.5pt"><span lang="EN-US">sbyte</span></p>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?