使用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]);

    }

}

 

 

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

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值