100165405.htm

来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 137 行 · 第 1/2 页

HTM
137
字号
<p class="2"><span lang="ES">End Class</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">下面看看</span><span lang="ES">VB.NET</span><span style="FONT-FAMILY: 宋体">编译器生成的</span><span lang="ES">MSIL</span><span style="FONT-FAMILY: 宋体">代码。</span></p>
<p class="MsoNormal" style="FTEL: 4.05pt"><span lang="ES">HelloVB.Hello()</span><span style="FONT-FAMILY: 宋体">方法首先调用基类</span><span lang="ES">HelloMCPP </span><span style="FONT-FAMILY: 宋体">的方法</span><span lang="ES">Hello()</span><span style="FONT-FAMILY: 宋体">,</span><span style="FONT-FAMILY: 宋体">在</span><span lang="ES">IL_0006 </span><span style="FONT-FAMILY: 宋体">行上</span><span style="FONT-FAMILY: 宋体">,</span><span style="FONT-FAMILY: 宋体">使用</span><span lang="ES">ldstr</span><span style="FONT-FAMILY: 宋体">把保存在元数据中的一个字符串推入堆栈</span><span style="FONT-FAMILY: 宋体">,</span><span style="FONT-FAMILY: 宋体">如图</span><span lang="ES">13-22</span><span style="FONT-FAMILY: 宋体">所示。</span></p>
<p align="center"><span lang="EN-US"><img height="142" src="13/image032.jpg" width="377" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US">&nbsp; 13-22</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 15pt"><span style="FONT-FAMILY: 宋体">另一个方法是</span><span lang="EN-US">Add()</span><span style="FONT-FAMILY: 宋体">。</span><span lang="EN-US">VB.NET </span><span style="FONT-FAMILY: 宋体">用</span><span lang="EN-US">add.ovf</span><span style="FONT-FAMILY: 宋体">来代替在</span><span lang="EN-US">MC++</span><span style="FONT-FAMILY: 宋体">生成的</span><span lang="EN-US">MSIL</span><span style="FONT-FAMILY: 宋体">代码中所使用的</span><span lang="EN-US">Add</span><span style="FONT-FAMILY: 宋体">方法。这条</span><span lang="EN-US">MSIL</span><span style="FONT-FAMILY: 宋体">语句在</span><span lang="EN-US">C++</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">VB.NET</span><span style="FONT-FAMILY: 宋体">上是不同的,但语句</span><span lang="EN-US">add.ovf </span><span style="FONT-FAMILY: 宋体">可生成更多的本机代码行,因为</span><span lang="EN-US">add.ovf </span><span style="FONT-FAMILY: 宋体">执行溢出检查。如果两个参数相加的结果太大,不能用目标类型表示,</span><span lang="EN-US">add.ovf</span><span style="FONT-FAMILY: 宋体">就会抛出一个类型为</span><span lang="EN-US">OverflowException</span><span style="FONT-FAMILY: 宋体">的异常。否则,</span><span lang="EN-US">Add</span><span style="FONT-FAMILY: 宋体">只执行两个数值相加的操作,而不考虑其结果是否可以使用目标类型来表示。此时,如果目标类型不够大,相加的和就会丢失,结果就会是一个错误的数字,所以,</span><span lang="EN-US">Add</span><span style="FONT-FAMILY: 宋体">的速度比较快,但</span><span lang="EN-US">add.ovf</span><span style="FONT-FAMILY: 宋体">比较安全,如图</span><span lang="EN-US">13-23</span><span style="FONT-FAMILY: 宋体">所示。</span></p>
<p align="center"><span lang="EN-US"><img height="154" src="13/image033.jpg" width="309" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US">&nbsp; 13-23</span></p>
<h4><span lang="ES">3. </span><span style="FONT-FAMILY: 黑体">使用</span><span lang="ES">C#</span><span style="FONT-FAMILY: 黑体">编写类</span></h4>
<p class="MsoNormal"><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">HelloCSharp</span><span style="FONT-FAMILY: 宋体">,添加对</span><span lang="EN-US">HelloVB</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">HelloMCPP</span><span style="FONT-FAMILY: 宋体">的引用,因为</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">类将派生于</span><span lang="EN-US">VB.NET</span><span style="FONT-FAMILY: 宋体">类。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">利用下面的代码创建类</span><span lang="EN-US">HelloCSharp</span><span style="FONT-FAMILY: 宋体">。在</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">类中执行的方法类似于</span><span lang="EN-US">MC++</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">VB.NET</span><span style="FONT-FAMILY: 宋体">类:</span><span lang="EN-US">Hello()</span><span style="FONT-FAMILY: 宋体">是基类的一个重写方法,而</span><span lang="EN-US">Add()</span><span style="FONT-FAMILY: 宋体">是一个新方法:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt"><span lang="ES">using System;</span><span class="MsoCommentReference"><span lang="ES" style="DISPLAY: none; FONT-SIZE: 8pt; FONT-FAMILY: 'Baskerville BE Regular'"> </span></span></p>
<p class="2" style="LINE-HEIGHT: 13pt"><span lang="ES">namespace Wrox.ProCSharp.Assemblies.CrossLanguage</span></p>
<p class="a6" style="LINE-HEIGHT: 13pt"><span lang="ES">{</span></p>
<p class="2" style="LINE-HEIGHT: 13pt"><span lang="ES">&nbsp;&nbsp; public class HelloCSharp : HelloVB</span></p>
<p class="a6" style="LINE-HEIGHT: 13pt"><span lang="ES">&nbsp;&nbsp; {</span></p>
<p class="2" style="LINE-HEIGHT: 13pt"><span lang="ES">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public HelloCSharp()</span></p>
<p class="2" style="LINE-HEIGHT: 13pt"><span lang="ES">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p class="2" style="LINE-HEIGHT: 13pt"><span lang="ES">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class="2" style="LINE-HEIGHT: 13pt"><span lang="ES">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public override void Hello()</span></p>
<p class="2" style="LINE-HEIGHT: 13pt"><span lang="ES">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p class="2" style="LINE-HEIGHT: 13pt"><span lang="ES">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base.Hello();</span></p>
<p class="2" style="LINE-HEIGHT: 13pt"><span lang="ES">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;Hello, C#&quot;);</span></p>
<p class="2" style="LINE-HEIGHT: 13pt"><span lang="ES">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class="2" style="LINE-HEIGHT: 13pt"><span lang="ES">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public new int Add(int val1, int val2)</span></p>
<p class="2" style="LINE-HEIGHT: 13pt"><span lang="ES">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p class="2" style="LINE-HEIGHT: 13pt"><span lang="ES">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return val1 + val2;</span></p>
<p class="2" style="LINE-HEIGHT: 13pt"><span lang="ES">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class="a6" style="LINE-HEIGHT: 13pt"><span lang="ES">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [STAThread]</span></p>
<p class="a6" style="LINE-HEIGHT: 13pt"><span lang="ES">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void Main()</span></p>
<p class="a6" style="LINE-HEIGHT: 13pt"><span lang="ES">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p class="2" style="LINE-HEIGHT: 13pt"><span lang="ES">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HelloCSharp hello = new HelloCSharp();</span></p>
<p class="2" style="LINE-HEIGHT: 13pt"><span lang="ES">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hello.Hello();</span></p>
<p class="a6" style="LINE-HEIGHT: 13pt"><span lang="ES">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class="a6" style="LINE-HEIGHT: 13pt"><span lang="ES">&nbsp;&nbsp; }</span></p>
<p class="a6" style="FTEL: 8.15pt"><span lang="ES">}</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">从图</span><span lang="ES">13-24</span><span style="FONT-FAMILY: 宋体">可以看出</span><span style="FONT-FAMILY: 宋体">,</span><span style="FONT-FAMILY: 宋体">为</span><span lang="ES">Hello()</span><span style="FONT-FAMILY: 宋体">方法生成的</span><span lang="ES">MSIL</span><span style="FONT-FAMILY: 宋体">代码与</span><span lang="ES">VB.NET </span><span style="FONT-FAMILY: 宋体">编译器生成的</span><span lang="ES">MSIL</span><span style="FONT-FAMILY: 宋体">代码相同。</span></p>
<p align="center"><span lang="EN-US"><img height="147" src="13/image034.jpg" width="392" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US">&nbsp; 13-24</span></p>
<p class="MsoNormal"><span lang="EN-US">Add()</span><span style="FONT-FAMILY: 宋体">方法</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">如图</span><span lang="EN-US">13-25</span><span style="FONT-FAMILY: 宋体">所示</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">则不同,它类似于</span><span lang="EN-US">MC++</span><span style="FONT-FAMILY: 宋体">代码。在进行计算时,</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">编译器不使用带有溢出的方法:检查</span><span lang="EN-US">Visual Studio .NET</span><span style="FONT-FAMILY: 宋体">项目中默认的编译器设置,用较快的</span><span lang="EN-US">MSIL</span><span style="FONT-FAMILY: 宋体">方法</span><span lang="EN-US">Add</span><span style="FONT-FAMILY: 宋体">来代替</span><span lang="EN-US">add.ovf</span><span style="FONT-FAMILY: 宋体">;使用</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">VB.NET</span><span style="FONT-FAMILY: 宋体">项目的配置属性均可以改变这个选项。在</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">项目中,当把</span><span lang="EN-US">Check for overflow underflow</span><span style="FONT-FAMILY: 宋体">设置为</span><span lang="EN-US">true</span><span style="FONT-FAMILY: 宋体">时,</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">编译器就可以生成与</span><span lang="EN-US">VB.NET </span><span style="FONT-FAMILY: 宋体">相同的</span><span lang="EN-US">MSIL</span><span style="FONT-FAMILY: 宋体">代码。与</span><span lang="EN-US">VB.NET</span><span style="FONT-FAMILY: 宋体">不同,利用</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">还可以通过</span><span lang="EN-US">checked</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">unchecked</span><span style="FONT-FAMILY: 宋体">运算符在每个表达式中选择这个选项。第</span><span lang="EN-US">5</span><span style="FONT-FAMILY: 宋体">章讨论了</span><span lang="EN-US">checked</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">unchecked</span><span style="FONT-FAMILY: 宋体">运算符。</span></p>
<p align="center"><span lang="EN-US"><img height="140" src="13/image035.jpg" width="356" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US">&nbsp; 13-25</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">最后,控制台应用程序的输出如图</span><span lang="EN-US">13-26</span><span style="FONT-FAMILY: 宋体">所示。</span></p>
<p align="center"><span lang="EN-US"><img height="67" src="13/image036.jpg" width="241" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US">&nbsp; 13-26</span></p>
<p class="a3" style="MARGIN-TOP: 8.15pt; FTEL: 21.45pt"><span style="FONT-FAMILY: 黑体">注意:</span></p>
<p class="a1" style="FTEL: 21.45pt"><span style="FONT-FAMILY: 楷体_GB2312">因为所有的</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 楷体_GB2312">语言都生成</span><span lang="EN-US">MSIL</span><span style="FONT-FAMILY: 楷体_GB2312">代码,所有的语言都使用</span><span lang="EN-US">.NET Framework</span><span style="FONT-FAMILY: 楷体_GB2312">中的类,所以在性能上是没有区别的。但仍有一些小的差别。首先,由于语言的不同,某些语言支持的数据类型而其他语言不支持。其次,生成的</span><span lang="EN-US">MSIL</span><span style="FONT-FAMILY: 楷体_GB2312">代码仍会有差别。例如前面的数字计算执行起<span style="LETTER-SPACING: 0.1pt">来就有差别:在默认配置下,</span></span><span lang="EN-US" style="LETTER-SPACING: 0.1pt">VB.NET</span><span style="FONT-FAMILY: 楷体_GB2312; LETTER-SPACING: 0.1pt">上的执行比较安全,而</span><span lang="EN-US" style="LETTER-SPACING: 0.1pt">C#</span><span style="FONT-FAMILY: 楷体_GB2312; LETTER-SPACING: 0.1pt">上的执行就比较快。</span><span lang="EN-US" style="LETTER-SPACING: 0.1pt">C#</span><span style="FONT-FAMILY: 楷体_GB2312; LETTER-SPACING: 0.1pt">也更灵</span><span style="FONT-FAMILY: 楷体_GB2312">活。</span></p></div>
                <!-- page -->
                <div class="page" style="text-align: center">
                    <a href="100165404.htm">上一页</a>&nbsp;&nbsp;&nbsp;<a href="index.html">首页</a>&nbsp;&nbsp;&nbsp;<a href="100165406.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='100165405.htm'><font color='red'>13.3.2  语言无关性(2)</font></a></h1>
                        <div id="divRealteNod2" style="padding-left: 2px">
                        <div style='float:left;width:49%'>·<a href='100165402.htm'>13.3  跨语言支持</a></div><div style='float:right;width:49%'>·<a href='100165403.htm'>13.3.1  CTS和CLS</a></div><div style='float:left;width:49%'>·<a href='100165404.htm'>13.3.2  语言无关性(1)</a></div><div style='float:right;width:49%'>·<a href='100165406.htm'>13.3.3  CLS要求</a></div><div style='float:left;width:49%'>·<a href='100165407.htm'>13.4  全局程序集缓存</a></div><div style='float:right;width:49%'>·<a href='100165408.htm'>13.4.1  本机图像生成器</a></div></div>
                    </div>
                </div>
                </div></div>
   
</body>
</html>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?