Monthly Archives: 2015年5月

c#函数的显式调用和隐式调用

有人问到就说一下,c#在某些情况下(比如匹配接口,方法和运算符时)会隐式的调用类的一些函数。

比如众所周知的,在输出的时候,比如常用的Console.WriteLine()这样的语句的时候,会隐式调用函数的ToString()函数。
但是这时候假如说这个类的ToString()是被重写过的的话,其调用和使用就会产生微妙的区别。
也就是说Console.WriteLine(Object)和Console.WriteLine(Object.ToString())是有区别的。
假设重写中有这样的一个构型 :
public override string ToString(var para = null) { }
那么此时Object.ToString()这样的调用是显式调用,先会泛型匹配,实际执行是ToString(null)这个重写。
但假如是隐式调用则还会是ToString()这样的调用,也就是继承自Object类的调用。

举个更具体的例子来说
Console.WriteLine(DateTimeOffset.Now);

Console.WriteLine(DateTimeOffset.Now.ToString());
就是两个不同的调用。
前者是隐式调用,而后者是显式调用。
而DateTimeOffset刚好有重写
public string ToString( IFormatProvider formatProvider )
而可以翻看声明就可以看到:
如果 formatProvider 为 null,则使用与当前区域性关联的 DateTimeFormatInfo 对象

所以结果上来说前者会是
05/19/2015 11:29:42 +08:00
而后者会是(Zh-CN 区)
2015/5/19 11:29:42 +08:00

这是需要在使用中注意的。