100162740.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 196 行 · 第 1/3 页
HTM
196 行
<p class="a6" style="MARGIN: 0cm 0cm 8.15pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> (</span><span style="FONT-FAMILY: 宋体">局部变量</span><span lang="EN-US">j</span><span style="FONT-FAMILY: 宋体">不能在这个作用域内声明两次,因为这会给变量</span><span lang="EN-US">j</span><span style="FONT-FAMILY: 宋体">赋予不同的含义,已用在</span><span lang="EN-US">'parent or current'</span><span style="FONT-FAMILY: 宋体">作用域内的变量</span><span lang="EN-US">j</span><span style="FONT-FAMILY: 宋体">表示其他内容</span><span lang="EN-US">)</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">其原因是:变量</span><span lang="EN-US">j</span><span style="FONT-FAMILY: 宋体">是在</span><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">Main</span><span style="FONT-FAMILY: 宋体">方法结束执行后,变量</span><span lang="EN-US">j</span><span style="FONT-FAMILY: 宋体">才超出作用域,第二个</span><span lang="EN-US">j(</span><span style="FONT-FAMILY: 宋体">不合法</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">则在循环的作用域内,该作用域嵌套在</span><span lang="EN-US">Main</span><span style="FONT-FAMILY: 宋体">方法的作用域内。编译器无法区别这两个变量,所以不允许声明第二个变量。这也是与</span><span lang="EN-US">C++</span><span style="FONT-FAMILY: 宋体">不同的地方,在</span><span lang="EN-US">C++</span><span style="FONT-FAMILY: 宋体">中,允许隐藏变量。</span></p>
<h4 style="TEXT-INDENT: 21.45pt"><span lang="EN-US">2. </span><span style="FONT-FAMILY: 黑体">字段和局部变量的作用域冲突</span></h4>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span><span style="FONT-FAMILY: 宋体">在某些环境下,可以区分名称相同</span><span lang="EN-US">(</span></span><span style="FONT-FAMILY: 宋体">尽管不是经过完全限定的名称</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">、作用域相同的两个标识符。此时编译器允许声明第二个变量。原因是</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">使得变量之间有一个基本的区分,它把声明为类型级的变量看作是字段,而把在方法中声明的变量看作局部变量。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><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">using System;</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 13pt"><span lang="EN-US"> </span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 13pt"><span lang="EN-US">namespace Wrox.ProCSharp.Basics</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 13pt"><span lang="EN-US">{</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 13pt"><span lang="EN-US"> class ScopeTest2</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 13pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 13pt"><span lang="EN-US"> static int j = 20;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 13pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 13pt"><span lang="EN-US"> public static void Main()</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 13pt"><span lang="FR"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 13pt"><span lang="FR"> int j = 30;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 13pt"><span lang="FR"> Console.WriteLine(j);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 13pt"><span lang="FR"> return;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 13pt"><span lang="EN-US"> }</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 13pt"><span lang="EN-US"> }</span></p>
<p class="a6" style="MARGIN: 0cm 0cm 8.15pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">即使在</span><span lang="EN-US">Main</span><span style="FONT-FAMILY: 宋体">方法的作用域内声明了两个变量</span><span lang="EN-US">j</span><span style="FONT-FAMILY: 宋体">,这段代码也会编译<span style="LETTER-SPACING: -0.5pt">——</span></span><span style="LETTER-SPACING: -0.5pt"> <span lang="EN-US">j</span></span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -0.5pt">被</span><span style="FONT-FAMILY: 宋体">定义在类级</span><span lang="EN-US">(class level)</span><span style="FONT-FAMILY: 宋体">上,在该类删除前是不会超出作用域的</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">在本例中,当</span><span lang="EN-US">Main</span><span style="FONT-FAMILY: 宋体">方法中断时,程序结束</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">。此时,在</span><span lang="EN-US">Main</span><span style="FONT-FAMILY: 宋体">方法中声明的新变量</span><span lang="EN-US">j</span><span style="FONT-FAMILY: 宋体">隐藏了同名的类级变量,所以在运行这段代码时,会显示数字</span><span lang="EN-US">30</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">但是,如果要引用类级变量,该怎么办?可以使用语法</span><span lang="EN-US">object.fieldname</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="a6" style="MARGIN: 3.25pt 0cm 0pt 21.45pt; TEXT-INDENT: 46.1pt"><span lang="EN-US">…</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 15pt"><span lang="EN-US"> public static void Main()</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 15pt"><span lang="EN-US"> {</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 15pt"><span lang="EN-US"> int j = 30;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 15pt"><span lang="EN-US"> Console.WriteLine(ScopeTest2.j);</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt; LINE-HEIGHT: 15pt"><span lang="EN-US"> }</span></p>
<p class="a6" 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">(</span><span style="FONT-FAMILY: 宋体">该字段属于类的一个特定实例</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">,就需要使用</span><span lang="EN-US">this</span><span style="FONT-FAMILY: 宋体">关键字。</span><span lang="EN-US">this</span><span style="FONT-FAMILY: 宋体">的作用与</span><span lang="EN-US">C++</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">Java</span><span style="FONT-FAMILY: 宋体">中的</span><span lang="EN-US">this</span><span style="FONT-FAMILY: 宋体">相同,与</span><span lang="EN-US">VB</span><span style="FONT-FAMILY: 宋体">中的</span><span lang="EN-US">Me</span><span style="FONT-FAMILY: 宋体">相同。</span></p>
<h3 style="MARGIN: 8.15pt 0cm"><span lang="EN-US">2.3.3<span> </span></span><span style="FONT-FAMILY: 黑体">常</span><span style="FONT-FAMILY: 黑体">量</span></h3>
<p class="MsoNormal"><span><span style="FONT-FAMILY: 宋体">在声明和初始化变量时,在变量的前面加上关键字</span><span lang="EN-US">const</span></span><span style="FONT-FAMILY: 宋体">,就可以把该变量指定为一个常量。顾名思义,常量是其值在使用过程中不会发生变化的变量:</span></p>
<p class="2" style="MARGIN: 9.8pt 0cm 9.8pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">const int a = 100; // This value cannot be changed</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span lang="EN-US">VB</span><span style="FONT-FAMILY: 宋体">和</span><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">C#</span><span style="FONT-FAMILY: 宋体">不支持</span><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">(</span><span style="FONT-FAMILY: 宋体">不改变包含对象的内容</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">,方法的常量参数等。这些细微的特性在</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">中都删除了,我们只能把局部变量和字段声明为常量。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><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 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 style="FONT-FAMILY: 宋体">常量的值必须能在编译时用于计算。因此,不能用从一个变量中提取的值来初始化常量。如果需要这么做,应使用只读字段</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">详见第</span><span lang="EN-US">3</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 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">static</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 style="FONT-FAMILY: 宋体">在程序中使用常量至少有</span><span lang="EN-US">3</span><span style="FONT-FAMILY: 宋体">个好处:</span></p>
<p class="1" style="MARGIN-LEFT: 37.85pt; TEXT-INDENT: -16.4pt"><span lang="EN-US" style="LETTER-SPACING: 0.1pt">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">常量用易于理解的清楚的名称替代了“含义不明确的数字或字符串”,使程序更易于阅读。</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 style="FONT-FAMILY: 宋体">常量使程序更易于修改。例如,在</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">程序中有一个</span><span lang="EN-US">SalesTax</span><span style="FONT-FAMILY: 宋体">常量,该常量的值为</span><span lang="EN-US">6%</span><span style="FONT-FAMILY: 宋体">。如果以后销售税率发生变化,可以把新值赋给这个常量,就可以修改所有的税款计算,而不必查找整个程序,修改税率为</span><span lang="EN-US">0.06</span><span style="FONT-FAMILY: 宋体">的每个项。</span></p>
<p class="MsoNormal"><span lang="EN-US"> </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 style="FONT-FAMILY: 宋体">常量更容易避免程序出现错误。如果要把另一个值赋给程序中的一个常量,而该常量已经有了一个值,编译器就会报告错误。</span></p></div>
<!-- page -->
<div class="page" style="text-align: center">
<a href="100162739.htm">上一页</a> <a href="index.html">首页</a> <a href="100162741.htm">下一页</a>
</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="divCurrentNode2" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100162740.htm'><font color='red'>2.3 变量</font></a></h1>
<div id="divRealteNod2" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100162737.htm'>1.8 小结</a></div><div style='float:right;width:49%'>·<a href='100162738.htm'>2.1 引言</a></div><div style='float:left;width:49%'>·<a href='100162739.htm'>2.2 第一个C#程序</a></div><div style='float:right;width:49%'>·<a href='100162741.htm'>2.4 预定义数据类型</a></div><div style='float:left;width:49%'>·<a href='100162742.htm'>2.5 流控制</a></div><div style='float:right;width:49%'>·<a href='100162743.htm'>2.6 枚举</a></div></div>
</div>
</div>
</div>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?