100162742.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 316 行 · 第 1/5 页
HTM
316 行
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 14.5pt"><span lang="EN-US"> case 3:</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 14.5pt"><span lang="EN-US"> Console.WriteLine("integerA =3");</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 14.5pt"><span lang="EN-US"> break;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 14.5pt"><span lang="EN-US"> default:</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 14.5pt"><span lang="EN-US"> Console.WriteLine("integerA is not 1,2, or 3");</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 14.5pt"><span lang="EN-US"> break;</span></p>
<p class="2" style="MARGIN: 0cm 0cm 8.15pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">注意</span><span lang="EN-US">case</span><span style="FONT-FAMILY: 宋体">的值必须是常量表达式<span style="LETTER-SPACING: -0.5pt">——</span>不允许使用变量。</span></p>
<p class="MsoNormal"><span lang="EN-US">C </span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US"> C++</span><span style="FONT-FAMILY: 宋体">程序员应很熟悉</span><span lang="EN-US">switch<sup>...</sup>case</span><span style="FONT-FAMILY: 宋体">语句,而</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US">switch<sup>...</sup>case</span><span style="FONT-FAMILY: 宋体">语句更安全。特别是它禁止所有</span><span lang="EN-US">case</span><span style="FONT-FAMILY: 宋体">中的失败条件。如果激活了块中靠前的一个</span><span lang="EN-US">case</span><span style="FONT-FAMILY: 宋体">子句,后面的</span><span lang="EN-US">case</span><span style="FONT-FAMILY: 宋体">子句就不会被激活,除非使用</span><span lang="EN-US">goto</span><span style="FONT-FAMILY: 宋体">语句特别标记要激活后面的</span><span lang="EN-US">case</span><span style="FONT-FAMILY: 宋体">子句。编译器会把没有</span><span lang="EN-US">break</span><span style="FONT-FAMILY: 宋体">语句的每个</span><span lang="EN-US">case</span><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">Control cannot fall through from one case label ('case 2:') to another</span></p>
<p class="MsoBodyTextIndent"><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 0pt">在某些限定的情况下,这种失败是允许的,但在大多数情况下,我们不希望出现这种失败,而且这会导致出现很难察觉的逻辑错误。让代码正常工作,而不是出现异常,这样不是更好吗?</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">但在使用</span><span lang="EN-US">goto</span><span style="FONT-FAMILY: 宋体">语句时</span><span lang="EN-US">(C#</span><span style="FONT-FAMILY: 宋体">支持</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">,会在</span><span lang="EN-US">switch<sup>...</sup>cases</span><span style="FONT-FAMILY: 宋体">中重复出现失败。如果确实想这么做,就应重新考虑设计方案了。下面的代码说明了如何使用</span><span lang="EN-US">goto</span><span style="FONT-FAMILY: 宋体">模拟失败,得到的代码会非常混乱:</span></p>
<p class="2" style="MARGIN: 8.15pt 0cm 0pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">// assume country and language are of type string</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">switch(country)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> case "America":</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> CallAmericanOnlyMethod();</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> goto case "Britain";</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> case "France":</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> language = "French";</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> break;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> case "Britain":</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> language = "English";</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> break;</span></p>
<p class="2" style="MARGIN: 0cm 0cm 8.15pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">但这有一种例外情况。如果一个</span><span lang="EN-US">case</span><span style="FONT-FAMILY: 宋体">子句为空,就可以从这个</span><span lang="EN-US">case</span><span style="FONT-FAMILY: 宋体">跳到下一个</span><span lang="EN-US">case</span><span style="FONT-FAMILY: 宋体">上,这样就可以用相同的方式处理两个或多个</span><span lang="EN-US">case</span><span style="FONT-FAMILY: 宋体">子句了</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">不需要</span><span lang="EN-US">goto</span><span style="FONT-FAMILY: 宋体">语句</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="2" style="MARGIN: 8.15pt 0cm 0pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">switch(country)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> case "au":</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> case "uk":</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> case "us":</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> language = "English";</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> break;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> case "at":</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> case "de":</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> language = "German";</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> break;</span></p>
<p class="2" style="MARGIN: 0cm 0cm 8.15pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">中,</span><span lang="EN-US">switch</span><span style="FONT-FAMILY: 宋体">语句的一个有趣的地方是</span><span lang="EN-US">case</span><span style="FONT-FAMILY: 宋体">子句的排放顺序是无关紧要的,甚至可以把</span><span lang="EN-US">default</span><span style="FONT-FAMILY: 宋体">子句放在最前面!因此,任何两个</span><span lang="EN-US">case</span><span style="FONT-FAMILY: 宋体">都不能相同。这包括值相同的不同常量,所以不能这样编写:</span></p>
<p class="2" style="MARGIN: 8.15pt 0cm 0pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">// assume country is of type string</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">const string england = "uk";</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">const string britain = "uk";</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">switch(country)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> case england:</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> case britain: // this will cause a compilation error</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> language = "English";</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> break;</span></p>
<p class="2" style="MARGIN: 0cm 0cm 8.15pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">上面的代码还说明了</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">中的</span><span lang="EN-US">switch</span><span style="FONT-FAMILY: 宋体">语句与</span><span lang="EN-US">C++</span><span style="FONT-FAMILY: 宋体">中的</span><span lang="EN-US">switch</span><span style="FONT-FAMILY: 宋体">语句的另一个不同之处:在</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">中,可以把字符串用作测试变量。</span></p>
<h3 style="MARGIN: 8.15pt 0cm"><span><span lang="EN-US">2.5.2 </span></span><span style="FONT-FAMILY: 黑体">循环</span></h3>
<p class="MsoNormal"><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">提供了</span><span lang="EN-US">4</span><span style="FONT-FAMILY: 宋体">种不同的循环机制</span><span lang="EN-US">(for</span><span style="FONT-FAMILY: 宋体">、</span><span lang="EN-US">while</span><span style="FONT-FAMILY: 宋体">、</span><span lang="EN-US">do<sup>...</sup>while</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">foreach)</span><span style="FONT-FAMILY: 宋体">,在满足某个条件之前,可以重复执行代码块。</span><span lang="EN-US">for</span><span style="FONT-FAMILY: 宋体">、</span><span lang="EN-US">while</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">do<sup>...</sup>while</span><span style="FONT-FAMILY: 宋体">循环与</span><span lang="EN-US">C++</span><span style="FONT-FAMILY: 宋体">中的对应循环相同。首先看看</span><span lang="EN-US">for </span><span style="FONT-FAMILY: 宋体">循环。</span></p>
<h4 style="TEXT-INDENT: 21.45pt"><span lang="EN-US">1. for</span><span style="FONT-FAMILY: 黑体">循环</span></h4>
<p class="MsoNormal"><span><span lang="EN-US">C#</span></span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US">for</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">for (initializer; condition; iterator)</span></p>
<p class="a6" style="MARGIN: 0cm 0cm 8.15pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> statement(s)</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">其中:</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; TEXT-INDENT: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span lang="EN-US">initializer</span><span style="FONT-FAMILY: 宋体">是指在执行第一次迭代前要计算的表达式</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">通常初始化为一个局部变量,作为循环计数器</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">;</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; TEXT-INDENT: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span lang="EN-US">condition</span><span style="FONT-FAMILY: 宋体">是在每次迭代循环前要测试的表达式</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">它必须等于</span><span lang="EN-US">true</span><span style="FONT-FAMILY: 宋体">,才能执行下一次迭代</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">;</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; TEXT-INDENT: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span lang="EN-US">iterator</span><span style="FONT-FAMILY: 宋体">是每次迭代完要计算的表达式</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">通常是递增循环计数器</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">。当</span><span lang="EN-US">condition</span><span style="FONT-FAMILY: 宋体">等于</span><span lang="EN-US">false</span><span style="FONT-FAMILY: 宋体">时,迭代停止。</span></p>
<p class="MsoNormal"><span lang="EN-US">for</span><span style="FONT-FAMILY: 宋体">循环是所谓的预测试循环,因为循环条件是在执行循环语句前计算的,如果循环条件为假,循环语句就根本不会执行。</span></p>
<p class="MsoNormal"><span lang="EN-US">for</span><span style="FONT-FAMILY: 宋体">循环非常适合用于一个语句或语句块重复执行预定的次数。下面的例子就是使用</span><span lang="EN-US">for</span><span style="FONT-FAMILY: 宋体">循环的典型用法,这段代码输出从</span><span lang="EN-US">0~99</span><span style="FONT-FAMILY: 宋体">的整数:</span></p>
<p class="2" style="MARGIN: 8.15pt 0cm 0pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">for (int i = 0; i < 100; i = i+1) // this is equivalent to</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> // For i = 0 To 99 in VB.</span></p>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?