100165406.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 97 行 · 第 1/2 页
HTM
97 行
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">所有的</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">语言都必须支持</span><span lang="EN-US">CLS</span><span style="FONT-FAMILY: 宋体">。在讨论</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">语言时,必须区分</span><span lang="EN-US">.NET consumer </span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US"> .NET extender</span><span style="FONT-FAMILY: 宋体">工具。</span></p>
<p class="MsoNormal"><span lang="EN-US">.NET consumer</span><span style="FONT-FAMILY: 宋体">工具只使用</span><span lang="EN-US">.NET Framework</span><span style="FONT-FAMILY: 宋体">中的类,它不能创建可以用于其他语言的</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">类。</span><span lang="EN-US">.NET consumer </span><span style="FONT-FAMILY: 宋体">工具可以使用任何与</span><span lang="EN-US">CLS</span><span style="FONT-FAMILY: 宋体">兼容的类。</span><span lang="EN-US">.NET extender</span><span style="FONT-FAMILY: 宋体">工具则可以满足客户的要求,另外还可以继承任何与</span><span lang="EN-US">CLS</span><span style="FONT-FAMILY: 宋体">兼容的</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">类,并定义了可以由客户使用的新</span><span lang="EN-US">CLS</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">.NET extender</span><span style="FONT-FAMILY: 宋体">工具,使用这些语言可以创建</span><span lang="EN-US">CLS</span><span style="FONT-FAMILY: 宋体">兼容类。</span></p>
<h4><span lang="ES">1. CLSCompliant</span><span style="FONT-FAMILY: 黑体">属性</span></h4>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">利用</span><span lang="ES">CLSCompliant</span><span style="FONT-FAMILY: 宋体">属性</span><span style="FONT-FAMILY: 宋体">,</span><span style="FONT-FAMILY: 宋体">可以把程序集标记为与</span><span lang="ES">CLS</span><span style="FONT-FAMILY: 宋体">兼容</span><span style="FONT-FAMILY: 宋体">,</span><span style="FONT-FAMILY: 宋体">这样可以确保这个程序集中的类能用于所有的</span><span lang="ES">.NET consumer</span><span style="FONT-FAMILY: 宋体">工具。在公共方法或受保护的方法中使用与</span><span lang="EN-US">CLS</span><span style="FONT-FAMILY: 宋体">不兼容的数据类型时,编译器会给出警告。在私有方法中使用什么样的数据类型则不重要,因为在类的外部使用其他语言时,根本就不能访问私有方法。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">当在公共方法和受保护的方法中使用与</span><span lang="EN-US">CLS</span><span style="FONT-FAMILY: 宋体">不兼容的类型时,为了让编译器发出警告,可以设置程序集中的属性</span><span lang="EN-US">CLSCompliant</span><span style="FONT-FAMILY: 宋体">。把这个属性添加到文件</span><span lang="EN-US">AssemblyInfo.cs</span><span style="FONT-FAMILY: 宋体">中:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 8.15pt"><span lang="ES">[assembly: System.CLSCompliant(true)]</span><span class="MsoCommentReference"><span lang="ES" style="DISPLAY: none; FONT-SIZE: 8pt; FONT-FAMILY: 'Baskerville BE Regular'"> </span></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">这样,在程序集中定义的所有类型和公共方法就都是兼容的。当参数的数据类型是不兼容的</span><span lang="EN-US">uint</span><span style="FONT-FAMILY: 宋体">时,编译器就会发出如下错误:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 8.15pt"><strong><span lang="EN-US">error CS3001: Argument type uint is not CLS-compliant </span></strong></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">把程序集标记为兼容时,仍可以定义不兼容的方法。如果要重写某些方法,使其参数是兼容和不兼容的数据类型,就必须把类中不兼容的方法的</span><span lang="EN-US">CLSCompliant </span><span style="FONT-FAMILY: 宋体">属性设置为</span><span lang="EN-US">false</span><span style="FONT-FAMILY: 宋体">。</span><span lang="EN-US">CLSCompliant </span><span style="FONT-FAMILY: 宋体">属性可以应用到类型、方法、属性、字段和事件上:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt"><span lang="ES">[CLSCompliant(false)]</span></p>
<p class="a6"><span lang="ES">void Method(uint i) </span></p>
<p class="a6"><span lang="ES">{</span></p>
<p class="a6"><span lang="ES"> //...</span></p>
<h4><span lang="ES">2. CLS</span><span style="FONT-FAMILY: 黑体">规则</span></h4>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">那么程序集与</span><span lang="ES">CLS</span><span style="FONT-FAMILY: 宋体">兼容有什么要求呢?</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="ES">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span style="FONT-FAMILY: 宋体">方法原型中的所有类型都必须与</span><span lang="ES">CLS</span><span style="FONT-FAMILY: 宋体">兼容。</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="ES">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span style="FONT-FAMILY: 宋体">数组元素的元素类型必须与</span><span lang="ES">CLS</span><span style="FONT-FAMILY: 宋体">兼容。数组中第一个元素的下标必须是</span><span lang="ES">0</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="ES">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span lang="ES">CLS</span><span style="FONT-FAMILY: 宋体">兼容类必须继承于</span><span lang="ES">CLS</span><span style="FONT-FAMILY: 宋体">兼容类,当然,</span><span lang="ES">System.Object</span><span style="FONT-FAMILY: 宋体">是与</span><span lang="ES">CLS</span><span style="FONT-FAMILY: 宋体">兼容的。</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="ES">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span style="FONT-FAMILY: 宋体">在</span><span lang="ES">CLS</span><span style="FONT-FAMILY: 宋体">兼容类中,方法名是不区分大小写的,两个方法不能仅根据其名称中字母的大小写来区分。</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="ES">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span style="FONT-FAMILY: 宋体">枚举的类型必须是</span><span lang="ES">Int16</span><span style="FONT-FAMILY: 宋体">、</span><span lang="ES">Int32</span><span style="FONT-FAMILY: 宋体">或</span><span lang="ES">Int64</span><span style="FONT-FAMILY: 宋体">。其他类型的枚举都是不兼容的。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">上述列举的要求只适用于公共成员和受保护的成员。私有方法则无需考虑这些要求,它们可以使用不兼容的类型,而程序集仍然是兼容的。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">除了这些要求外,还应遵循更一般的命名约定</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">详见第</span><span lang="EN-US">2</span><span style="FONT-FAMILY: 宋体">章</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">。</span><span lang="EN-US">CLS</span><span style="FONT-FAMILY: 宋体">兼容类不需要严格遵循这些规则,但遵循这些规则会使工作更容易完成。</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">int</span><span style="FONT-FAMILY: 宋体">、</span><span lang="EN-US">long</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">float </span><span style="FONT-FAMILY: 宋体">类型等同于</span><span lang="EN-US">VB.NET </span><span style="FONT-FAMILY: 宋体">中的</span><span lang="EN-US">Integer</span><span style="FONT-FAMILY: 宋体">、</span><span lang="EN-US">Long</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US"> Single</span><span style="FONT-FAMILY: 宋体">。在方法名中使用数据类型名时,应使用一般的类型名,而不是某语言特定的类型名,即应使用</span><span lang="EN-US">Int32</span><span style="FONT-FAMILY: 宋体">、</span><span lang="EN-US">Int64</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US"> Single</span><span style="FONT-FAMILY: 宋体">:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt"><span lang="EN-US">int ReadInt32();</span></p>
<p class="2"><span lang="EN-US">long ReadInt64();</span></p>
<p class="2" style="FTEL: 8.15pt"><span lang="EN-US">float ReadSingle();</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">可以看出,在利用</span><span lang="EN-US">CLS</span><span style="FONT-FAMILY: 宋体">规范和规则进行编译时,很容易创建出可以用于多种语言的组件。不需要使用所有的</span><span lang="EN-US">.NET consumer</span><span style="FONT-FAMILY: 宋体">语言来测试该组件。</span></p></div>
<!-- page -->
<div class="page" style="text-align: center">
<a href="100165405.htm">上一页</a> <a href="index.html">首页</a> <a href="100165407.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='100165406.htm'><font color='red'>13.3.3 CLS要求</font></a></h1>
<div id="divRealteNod2" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100165403.htm'>13.3.1 CTS和CLS</a></div><div style='float:right;width:49%'>·<a href='100165404.htm'>13.3.2 语言无关性(1)</a></div><div style='float:left;width:49%'>·<a href='100165405.htm'>13.3.2 语言无关性(2)</a></div><div style='float:right;width:49%'>·<a href='100165407.htm'>13.4 全局程序集缓存</a></div><div style='float:left;width:49%'>·<a href='100165408.htm'>13.4.1 本机图像生成器</a></div><div style='float:right;width:49%'>·<a href='100165409.htm'>13.4.2 全局程序集缓存查看器</a></div></div>
</div>
</div>
</div></div>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?