使用Reflector反射.NET源码比较Console.Write(char[].ToString()) 与Console.Write(char[])

 

文章作者:李元波

文章出处: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

 

问题1datas.ToString()怎么会转换成 System.Char[]

问题2Console.Write(datas )为什么能把里面的字符都显示出来?

 

l  首先来解决第一个问题:

datas.ToString()怎么会转换成 System.Char[]

dataschar[]数组,也是Array的一个实例,那么我们一起到MSDN里面找一下Array里面的ToString()方法。内容如下:  

 

ToString

返回表示当前 Object String (继承自 Object。)

   我们发现,原来数组中的ToString()继承自Object,那么objectToString()又是完成了什么工作呢?现在隆重推出一个重量级人物.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.Write(buffer);

}

 

 

然后继续查看Out.Write(buffer);

这时候我们发现:

²  OutConsole的一个TextWriter属性,原型如下:

ü   public static TextWriter Out { get; }

²  继续查看TextWriterWrite(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]);

    }

}

 

 

²  至此我们看到了原因了:这里用了一个循环遍历数组的方式来显示其数据。

 

你可能感兴趣的:(.Net随笔,.net,buffer,object,string,工具,c#)