参考:http://kb.cnblogs.com/page/69729/1/
先看一个例子
不知道是否有印象 有时候我们从数据库中读出时间后,想输出1988-10-10这样格式的时间时,一般要把string先Convert.ToDateTime然后再.ToString("yyyy-MM-dd");
但是string型的 字符串直接点ToString()是没有这样的功能的
这说明了DateTime和String型的ToString方法是有差异的
string.ToString()的原型
{
return this ;
}
就是直接甩出自己,因为就是一个字符串(这里不考虑IFormatProvider重载,这无关紧要,下同)
DateTime的ToString()
{
return DateTimeFormat.Format( this , null , DateTimeFormatInfo.CurrentInfo);
}
public string ToString( string format)
{
return DateTimeFormat.Format( this , format, DateTimeFormatInfo.CurrentInfo);
}
看到了吗,两种类型我贴出的代码连ToString()个数都不一样,DateTime除了重写了继承自Object的ToString()还带了另外的ToString(),而string型的却没有
也许你会说这有什么,重载而已嘛
但是为什么String型的却没有这样的重载呢,这就要把IFormattable搬出来了
看string类和DateTime结构定义的差别
public struct DateTime : IComparable, IFormattable, IConvertible, ISerializable, IComparable < DateTime > , IEquatable < DateTime >
DateTime继承了IFormattable接口而String没有
在http://kb.cnblogs.com/page/69729/1/中已经说的很详细了 我这里 就做点笔记
1.string.Format("Hello Cnblogs, I am {0},Today is {1:yyyy-MM-dd} {2}.", name, DateTime.Now);的内部原理 就是 使用了StringBuilder的AppendFormat方法
StringBuilder builder = new StringBuilder(format.Length + (args.Length * 8));
builder.AppendFormat(provider, format, args);
return builder.ToString();
先判断是否继承接口
如果不继承,则调用重写的Tostring方法(这个时候格式符就没什么作用了)
如果继承了 则调用接口定义的方法,这个时候如果没有格式符,那么输出的结果将跟重写的ToString()的效果一样,但是这时候仍然调用的是接口的方法,只不过在接口的ToString方法 中定义了 如果 没有参数 则调用重写的ToString()方法
未完待续。。。。