100162756.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 237 行 · 第 1/3 页
HTM
237 行
<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">ToString()</span><span style="FONT-FAMILY: 宋体">方法:是快速获取对象的字符串表示的一种便捷方式。当只需要快速获取对象的内容,用于调试时就可以使用这个方法。在数据的格式化方面,它提供的选择非常少:例如,日期在原则上可以表示为许多不同的格式,但</span><span lang="EN-US">DateTime.ToString()</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">IFormattable</span><span style="FONT-FAMILY: 宋体">接口</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">详见第</span><span lang="EN-US">8</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">GetHashTable()</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">GetHashTable()</span><span style="FONT-FAMILY: 宋体">方法。对该方法重载的执行方式有一些相当严格的限制,这些将在第</span><span lang="EN-US">9</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">Equals()(</span><span style="FONT-FAMILY: 宋体">两个版本</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">ReferenceEquals()</span><span style="FONT-FAMILY: 宋体">方法:如果把</span><span lang="EN-US">3</span><span style="FONT-FAMILY: 宋体">个用于比较对象相等性的不同方法组合起来,就说明</span><span lang="EN-US">.NET Framework</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><span lang="EN-US">Equals()</span><span style="FONT-FAMILY: 宋体">方法时也有一些限制,如果选择这么做,就是因为</span><span lang="EN-US">System.Collections</span><span style="FONT-FAMILY: 宋体">命名空间中的一些基类要调用该方法,并希望它以特定的方式执行。第</span><span lang="EN-US">5</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">Finalize()</span><span style="FONT-FAMILY: 宋体">方法:第</span><span lang="EN-US">7</span><span style="FONT-FAMILY: 宋体">章将介绍这个方法,它最接近</span><span lang="EN-US">C++</span><span style="FONT-FAMILY: 宋体">风格的析构函数,在引用对象被回收调用,以清理资源时。</span><span lang="EN-US">Finalize()</span><span style="FONT-FAMILY: 宋体">方法的</span><span lang="EN-US">Object</span><span style="FONT-FAMILY: 宋体">执行代码实际上什么也没有做,因而被垃圾收集器忽略。如果对象拥有对未托管资源的引用,则在该对象被删除时,就需要删除这些引用,此时一般要重写</span><span lang="EN-US">Finalize()</span><span style="FONT-FAMILY: 宋体">。垃圾收集器不能直接重写该方法,因为它只负责托管的资源,只能使用用户提供的</span><span lang="EN-US">Finalize()</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">GetType()</span><span style="FONT-FAMILY: 宋体">方法:这个方法返回从</span><span lang="EN-US">System.Type</span><span style="FONT-FAMILY: 宋体">派生的类的一个实例。这个对象可以提供对象所属类的更多信息,包括基本类型、方法、属性等。</span><span lang="EN-US">System.Type</span><span style="FONT-FAMILY: 宋体">还提供了</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">反射技术的入口。这个主题详见第</span><span lang="EN-US">10</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">MemberwiseClone()</span><span style="FONT-FAMILY: 宋体">方法:这是</span><span lang="EN-US">System.Object</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>
<h3 style="MARGIN: 8.15pt 0cm"><span lang="EN-US">3.4.2 ToString()</span><span style="FONT-FAMILY: 黑体">方法</span></h3>
<p class="MsoNormal"><span><span style="FONT-FAMILY: 宋体">第</span><span lang="EN-US">2</span></span><span style="FONT-FAMILY: 宋体">章已经提到了</span><span lang="EN-US">ToString()</span><span style="FONT-FAMILY: 宋体">方法,它是快速获取对象的字符串表示的最便捷的方式。</span></p>
<p class="MsoNormal"><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">int i = </span><span style="FONT-FAMILY: 宋体">–</span><span lang="EN-US">50;</span></p>
<p class="2" style="MARGIN: 0cm 0cm 8.15pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">string str = i.ToString(); // returns "</span><span style="FONT-FAMILY: 宋体">–</span><span lang="EN-US">50"</span></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><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">enum Colors {Red, Orange, Yellow};</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">// later on in code...</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">Colors favoriteColor = Colors.Orange;</span></p>
<p class="2" style="MARGIN: 0cm 0cm 8.15pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">string str = favoriteColor.ToString(); // returns "Orange"</span></p>
<p class="MsoNormal"><span lang="EN-US">Object.ToString() </span><span style="FONT-FAMILY: 宋体">声明为虚类型,在这些例子中,该方法的实现都是为</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">预定义数据类型重写过的代码,以返回这些类型的正确字符串表示。您可能没有想到,</span><span lang="EN-US">Colors</span><span style="FONT-FAMILY: 宋体">枚举就是一个预定义数据类型,它实际上执行为一个派生于</span><span lang="EN-US">System.Enum</span><span style="FONT-FAMILY: 宋体">的结构,而</span><span lang="EN-US">System.Enum</span><span style="FONT-FAMILY: 宋体">有一个相当聪明的</span><span lang="EN-US">ToString()</span><span style="FONT-FAMILY: 宋体">重写方法,来处理用户定义的所有枚举。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">如果不在自己定义的类中重写</span><span lang="EN-US">ToString()</span><span style="FONT-FAMILY: 宋体">,该类将只继承</span><span lang="EN-US">System.Object</span><span style="FONT-FAMILY: 宋体">执行方式<span style="LETTER-SPACING: -1pt">——</span></span> <span style="FONT-FAMILY: 宋体">显示类的名称。如果希望</span><span lang="EN-US">ToString()</span><span style="FONT-FAMILY: 宋体">返回一个字符串,其中包含类中对象的值,就需要重写它。下面用一个例子</span><span lang="EN-US">Money</span><span style="FONT-FAMILY: 宋体">来说明这一点。在该例子中,定义一个非常简单的类</span><span lang="EN-US">Money</span><span style="FONT-FAMILY: 宋体">,表示美元数。</span><span lang="EN-US">Money</span><span style="FONT-FAMILY: 宋体">是</span><span lang="EN-US">decimal</span><span style="FONT-FAMILY: 宋体">类的包装器,提供了一个</span><span lang="EN-US">ToString()</span><span style="FONT-FAMILY: 宋体">方法。注意,这个方法必须声明为</span><span lang="EN-US">override</span><span style="FONT-FAMILY: 宋体">,因为它将替代</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">重写</span><span lang="EN-US">)Object</span><span style="FONT-FAMILY: 宋体">提供的</span><span lang="EN-US">ToString()</span><span style="FONT-FAMILY: 宋体">方法。第</span><span lang="EN-US">4</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="2" style="MARGIN: 8.15pt 0cm 0pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">using System;</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">namespace Wrox.ProCSharp.OOCSharp</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"> class MainEntryPoint</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"> static void Main(string[] args)</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"> Money cash1 = new Money();</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> cash1.Amount = 40M;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> Console.WriteLine("cash1.ToString() returns: " + cash1.ToString());</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> Console.ReadLine();</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"> }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> class Money</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"> private decimal amount;</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"> public decimal Amount</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"> get</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"> return amount;</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"> set</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"> amount = value;</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"> }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US"> public override string ToString()</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"> return "$" + Amount.ToString();</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"> }</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">C#</span><span style="FONT-FAMILY: 宋体">已经有表示货币的预定义类型</span><span lang="EN-US">decimal</span><span style="FONT-FAMILY: 宋体">。所以在现实生活中,不必编写这样的类来重复该功能,除非要给它添加其他方法。在许多情况下,由于格式化要求,也可以使用</span><span lang="EN-US">String.Format()</span><span style="FONT-FAMILY: 宋体">方法</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">详见第</span><span lang="EN-US">8</span><span style="FONT-FAMILY: 宋体">章</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">格式化货币字符串,而不是</span><span lang="EN-US">ToString()</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在</span><span lang="EN-US">Main()</span><span style="FONT-FAMILY: 宋体">方法中,先实例化一个</span><span lang="EN-US">Money</span><span style="FONT-FAMILY: 宋体">对象,在这个实例化过程中调用了</span><span lang="EN-US">ToString()</span><span style="FONT-FAMILY: 宋体">。对于</span><span lang="EN-US">Money</span><span style="FONT-FAMILY: 宋体">对象,选择我们自己的重写方法,显示类的信息。运行这段代码,会得到如下结果:</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN: 8.15pt 0cm 0pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">StringRepresentations</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN: 0cm 0cm 8.15pt 21.45pt; TEXT-INDENT: 18.45pt"><span lang="EN-US">cash1.ToString() returns: $40</span></p></div>
<!-- page -->
<div class="page" style="text-align: center">
<a href="100162755.htm">上一页</a> <a href="index.html">首页</a> <a href="100162757.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='100162756.htm'><font color='red'>3.4 Object类</font></a></h1>
<div id="divRealteNod2" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100162753.htm'>3.1 类和结构</a></div><div style='float:right;width:49%'>·<a href='100162754.htm'>3.2 类成员</a></div><div style='float:left;width:49%'>·<a href='100162755.htm'>3.3 结构</a></div><div style='float:right;width:49%'>·<a href='100162757.htm'>3.5 小结</a></div><div style='float:left;width:49%'>·<a href='100165324.htm'>目录</a></div><div style='float:right;width:49%'>·<a href='100165325.htm'>译者序</a></div></div>
</div>
</div>
</div></div>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?