由Console.WriteLine想到的
时间:2011-05-01 来源:HeartLight
由Console.WriteLine想到的
对于匿名对象我们可以这样输出:
1 var test = new { name="test",Age=22};
2 Console.WriteLine(test);
结果是:
{Name=test,Age=22}
那么这个结果是怎么来的呢,为什么Console.WriteLine可以直接输出test的内容呢,它怎么知道test有多几个字段呢?
由IL DASM中可以看到Console.WriteLine(test)实际上调用的是System.Console::WriteLine(object)
我们接着看看System.Console::WriteLine(object)是怎么实现的,.Net中的代码如下:
1 public virtual void WriteLine(object value)
2 {3 if (value == null)
4 {
5 this.WriteLine();
6 }
7 else
8 {
9 IFormattable formattable = value as IFormattable;
10 if (formattable != null)
11 {
12 this.WriteLine(formattable.ToString(null, this.FormatProvider));
13 }
14 else
15 {
16 this.WriteLine(value.ToString());
17 }
18 }
19 }
它的执行流程是这样的:
(1) 首先检查对象引用是否为空,如果为空则输出空行。
(2) 否则,就将对象转换为IFormattable接口,IFormattable只包含了一个方法:
1 [ComVisible(true)]
2 public interface IFormattable3 {
4 // Methods
5 string ToString(string format, IFormatProvider formatProvider);
6 }
(3) 如果对象实现了IFormattable接口,则调用具体的格式化输出方法,否则就直接输出对象的值。
相关阅读 更多 +