文章作者:李元波
文章出处:http://blog.csdn.net/ThunderLight/archive/2009/11/04/4767889.aspx
欢迎转载,转载时请注明出处。谢谢合作。
首先看一下下面的代码,这两个输出都会是什么结果呢?
char[] datas = {'a','b','c','d'};
Console.Write(datas.ToString() );
Console.Write(datas );
答案是:
System.Char[] abcd
问题1:datas.ToString()怎么会转换成 System.Char[]?
问题2:Console.Write(datas )为什么能把里面的字符都显示出来?
l 首先来解决第一个问题:
datas.ToString()怎么会转换成 System.Char[]?
datas是char[]数组,也是Array的一个实例,那么我们一起到MSDN里面找一下Array里面的ToString()方法。内容如下:
| ToString | 返回表示当前 Object 的 String。 (继承自 Object。) |
我们发现,原来数组中的ToString()继承自Object,那么object的ToString()又是完成了什么工作呢?现在隆重推出一个重量级人物.NET Reflector。
.NET Reflector何许人也?
这是一款功能很强大.NET反射工具,用它的创造者说就是可以“Explore, browse, and analyze .NET assemblies”,所以在这里我们可以使用这个工具轻而易举的查看C#的源代码了,因此我们可以使用这个工具来看一下Object.ToString()到底做了什么事情。
另外大家可以通过http://www.red-gate.com/products/reflector/来下载Reflector。
Object.ToString() 具体代码如下:
public virtual string ToString() { return this.GetType().ToString(); } |
到这里我们立刻明白了,datas.ToString()之所以为 System.Char[],实际上显示的是this.GetType()的内容。 说到这里有的朋友会疑问this.GetType()后面不是还有一个ToString()吗?确实是这样不过它已经被Type 重写了。
l 接着来解决第二个问题:
Console.Write(datas )为什么能把里面的字符都显示出来?
我们依然使用Reflector去查看Console.Write(Array)或者 Console.Write(char[]),很幸运使用Reflector我们找到了Console.Write(char[]),具体代码如下:
public static void Write(char[] buffer) { } |
这时候我们发现:
² Out是Console的一个TextWriter属性,原型如下:
ü public static TextWriter Out { get; }
² 继续查看TextWriter的Write(char[] buffer)方法得到以下代码:
1. public virtual void Write(char[] buffer) 2. { 3. if (buffer != null) 4. { 5. this.Write(buffer, 0, buffer.Length); 6. } 7. } |
² 继续查看第7行代码中的的Write(..)方法得到以下代码:
public virtual void Write(char[] buffer, int index, int count) { //这里省略一些代码 for (int i = 0; i < count; i++) { this.Write(buffer[index + i]); } } |
² 至此我们看到了原因了:这里用了一个循环遍历数组的方式来显示其数据。