100165386.htm

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

HTM
118
字号
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">// later on in the code</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">Y = InchesToCm(X);</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">就可以用下面的代码对其进行替换:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">Y = X * 2.54;</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">或者把下面的代码:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; string Message = &quot;Hi&quot;;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; </span><span lang="FR">Console.WriteLine(Message);</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">替换成:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">Console.WriteLine(&quot;Hi&quot;);</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">因此,在过程中不必声明不必要的对象引用。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><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">C#</span><span style="FONT-FAMILY: 宋体">来说,上述优化很可能在</span><span lang="EN-US">JIT</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></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">问题是,像上面例子中的优化可以使代码运行得更快,但它们对于调试来说,就没什么好处了。假定在第一个例子中,要在</span><span lang="EN-US">InchesToCm()</span><span style="FONT-FAMILY: 宋体">方法内部设置一个断点,看看其中发生了什么。如果可执行代码没有</span><span lang="EN-US">InchesToCm()</span><span style="FONT-FAMILY: 宋体">方法,因为编译器已删除了它,该怎么办?如果在</span><span lang="EN-US">Message</span><span style="FONT-FAMILY: 宋体">变量上设置了一个监视点,但在编译好的代码中根本没有这个变量,该怎么办?</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span lang="EN-US" style="COLOR: black">(2) </span><span style="COLOR: black; FONT-FAMILY: 宋体">调试程序符号</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">在调试时,常常需要查看变量的值,因此需要通过该变量的源代码的名称来指定它们。问题是可执行代码一般不包含这些变量的名称<span style="LETTER-SPACING: -1pt">&mdash;&mdash;</span></span><span style="LETTER-SPACING: -1pt"> </span><span style="FONT-FAMILY: 宋体">编译器用内存地址取代了它们。</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">对这种情形进行了一定的改进。程序集中的某些对象是与其名称一起存储的,但只有小部分对象是这样,例如公共类和方法。这些名称仍在程序集进行</span><span lang="EN-US">JIT</span><span style="FONT-FAMILY: 宋体">编译时被删除。如果在调试程序检查可执行代码时,要求调试程序给出变量</span><span lang="EN-US">HeightInInches</span><span style="FONT-FAMILY: 宋体">的值,也不能得到我们希望的结果,它只能给出地址,根本就没有</span><span lang="EN-US">HeightInInches</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="MsoNormal" style="LINE-HEIGHT: 17pt"><span lang="EN-US" style="COLOR: black">(3) </span><span style="COLOR: black; FONT-FAMILY: 宋体">额外的源代码调试命令</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">一个相关的问题是经常遇到的,在调试时,代码中有额外的命令行显示与调试相关的重要信息。显然,在发布软件前,必须从可执行代码中完全删除这些相关命令。可以手工完成这个任务,但如果仅是以某种方式标记这些语句,让编译器在编译代码时忽略它们,再发布软件,就并不是那么容易。本书的第一部分已经讨论过,在</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">中,可以定义一个合适的处理器符号,再把它和</span><span lang="EN-US">Conditional</span><span style="FONT-FAMILY: 宋体">属性结合在一起使用,这就是所谓的条件编译。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">与最终销售的产品相比,即使把这些特性都加上,编译所有的商业软件和调试它们也是有细微差别的。</span><span lang="EN-US">Visual Studio .NET</span><span style="FONT-FAMILY: 宋体">可以把这些都考虑进去,因为如前所述,它存储了编译代码时传递给编译器的所有信息,为了找出不同类型的生成文件,</span><span lang="EN-US">Visual Studio</span><span style="FONT-FAMILY: 宋体">只需要存储多套这类信息。不同的生成信息就称为配置。在创建一个项目时,</span><span lang="EN-US">Visual Studio .NET</span><span style="FONT-FAMILY: 宋体">会自动提供两种配置,分别是</span><span lang="EN-US">Debug</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">Release</span><span style="FONT-FAMILY: 宋体">:</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体">调试配置:通常会指定不进行任何优化,在可执行代码中给出额外的调试信息,编译器假定给出了调试预处理器符号</span><span lang="EN-US">Debug</span><span style="FONT-FAMILY: 宋体">,除非在源代码中显式指定了</span><span lang="EN-US">#undefined</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体">发布配置:通常指定编译器要优化,在可执行代码中没有额外的调试信息,编译器假定没有给出任何调试预处理器符号。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="COLOR: black; FONT-FAMILY: 宋体">也可以定义自己的配置。例如,建立专业级的生成和企业级的生成,以发布两个版本的软件。过去,对于</span><span lang="EN-US" style="COLOR: black">C++</span><span style="COLOR: black; FONT-FAMILY: 宋体">项目来说,因为</span><span lang="EN-US" style="COLOR: black">Windows NT</span><span style="COLOR: black; FONT-FAMILY: 宋体">支持</span><span lang="EN-US" style="COLOR: black">Unicode</span><span style="COLOR: black; FONT-FAMILY: 宋体">字符编码,而</span><span lang="EN-US" style="COLOR: black">Windows 95</span><span style="COLOR: black; FONT-FAMILY: 宋体">不支持,所以通常</span><span lang="EN-US" style="COLOR: black">C++</span><span style="COLOR: black; FONT-FAMILY: 宋体">项目有一个</span><span lang="EN-US" style="COLOR: black">Unicode</span><span style="COLOR: black; FONT-FAMILY: 宋体">配置和一个</span><span lang="EN-US" style="COLOR: black">MBCS(</span><span style="COLOR: black; FONT-FAMILY: 宋体">多字节字符集</span><span lang="EN-US" style="COLOR: black">)</span><span style="COLOR: black; FONT-FAMILY: 宋体">配置。</span></p>
<h4 style="FTEL: 21.45pt"><span lang="EN-US">3. </span><span style="FONT-FAMILY: 黑体">选择配置</span></h4>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">一个很明显的问题是,因为</span><span lang="EN-US">Visual Studio .NET</span><span style="FONT-FAMILY: 宋体">存储了多个配置的信息,在生成一个项目时,该如何确定使用哪个配置?答案是总是有一个现行配置,在要求</span><span lang="EN-US">Visual Studio .NET</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="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="COLOR: black; FONT-FAMILY: 宋体">在默认情况下,创建一个项目时,调试配置就是现行配置。单击</span><span lang="EN-US" style="COLOR: black">Build</span><span style="COLOR: black; FONT-FAMILY: 宋体">菜单选项,选择</span><span lang="EN-US" style="COLOR: black">Configuration Manager</span><span style="COLOR: black; FONT-FAMILY: 宋体">,就可以改变现行配置。</span></p>
<h4 style="FTEL: 21.45pt"><span lang="EN-US">4. </span><span style="FONT-FAMILY: 黑体">编辑配置</span></h4>
<p class="MsoNormal" style="LINE-HEIGHT: 17.6pt"><span style="FONT-FAMILY: 宋体">除了选择现行配置外,还可以查看和编辑配置,为此,需要在</span><span lang="EN-US">Solution Explorer</span><span style="FONT-FAMILY: 宋体">中选择相应的项目,然后在</span><span lang="EN-US">Project</span><span style="FONT-FAMILY: 宋体">菜单中选择</span><span lang="EN-US">Properties</span><span style="FONT-FAMILY: 宋体">,打开一个非常复杂的对话框</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">在</span><span lang="EN-US">Solution Explorer</span><span style="FONT-FAMILY: 宋体">中右击项目名,在上下文菜单中选择</span><span lang="EN-US">Properties</span><span style="FONT-FAMILY: 宋体">,也可以打开这个对话框</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17.6pt"><span style="FONT-FAMILY: 宋体">该对话框包含一个树形视图,在该树形视图中可以选择许多不同的区域,以查看或编辑。这里不详细介绍所有的区域,只介绍其中两个最重要的区域。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17.6pt"><span style="FONT-FAMILY: 宋体">在屏幕图</span><span lang="EN-US">12-21</span><span style="FONT-FAMILY: 宋体">中,树形视图有两个顶级节点、公共属性和配置属性,公共属性是所有配置都有的属性,配置属性则专用于一个特定配置。在这个屏幕图中,显示了本章前面创建的</span><span lang="EN-US">BasicConsoleApp</span><span style="FONT-FAMILY: 宋体">项目的常用跨配置编译器选项。</span></p>
<p align="center"><span lang="EN-US"><img height="297" src="12/image021.jpg" width="434" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US">&nbsp; 12-21</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17.6pt"><span style="FONT-FAMILY: 宋体">注意,可以选择要生成的程序集名和程序集的类型。其中的选项是控制台应用程序,</span><span lang="EN-US">Windows</span><span style="FONT-FAMILY: 宋体">应用程序和类库。当然,还可以改变程序集的类型</span><span lang="EN-US"> (</span><span style="FONT-FAMILY: 宋体">尽管这还有争议,但用户可能想知道,在</span><span lang="EN-US">Visual Studio .NET</span><span style="FONT-FAMILY: 宋体">最初生成项目时,为什么不能选择正确的项目类型的原因</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17.6pt"><span style="FONT-FAMILY: 宋体">屏幕图</span><span lang="EN-US">12-22</span><span style="FONT-FAMILY: 宋体">显示了生成文件的配置属性。注意,对话框顶部的列表框允许指定要查看的配置。此时可以查看调试配置<span style="LETTER-SPACING: -1pt">&mdash;&mdash;</span></span><span style="LETTER-SPACING: -1pt"> </span><span style="FONT-FAMILY: 宋体">假定编译器定义了</span><span lang="EN-US">DEBUG </span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US"> TRACE</span><span style="FONT-FAMILY: 宋体">预处理器符号。如上所述,在调试配置中,代码没有优化,并会生成额外的调试信息。</span></p>
<p align="center"><span lang="EN-US"><img height="299" src="12/image022.jpg" width="440" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="COLOR: black; FONT-FAMILY: 宋体">图</span><span lang="EN-US" style="COLOR: black">&nbsp; 12-22</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">一般情况下,用户不需要调整配置设置。如果需要使用它们,了解不同配置属性的区别是非常有用的。</span></p></div>
                <!-- page -->
                <div class="page" style="text-align: center">
                    <a href="100165385.htm">上一页</a>&nbsp;&nbsp;&nbsp;<a href="index.html">首页</a>&nbsp;&nbsp;&nbsp;<a href="100165387.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='100165386.htm'><font color='red'>12.1.6  生成项目</font></a></h1>
                        <div id="divRealteNod2" style="padding-left: 2px">
                        <div style='float:left;width:49%'>·<a href='100165383.htm'>12.1.3  Windows应用程序代码</a></div><div style='float:right;width:49%'>·<a href='100165384.htm'>12.1.4  读取Visual Studio 6项目</a></div><div style='float:left;width:49%'>·<a href='100165385.htm'>12.1.5  项目的浏览和编码</a></div><div style='float:right;width:49%'>·<a href='100165387.htm'>12.1.7  调试</a></div><div style='float:left;width:49%'>·<a href='100165388.htm'>12.2  其他.NET工具</a></div><div style='float:right;width:49%'>·<a href='100165389.htm'>12.2.1  ASP.NET Web Matrix Project</a></div></div>
                    </div>
                </div>
                </div></div>
   
</body>
</html>

⌨️ 快捷键说明

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