IFormattable笔记

参考:http://kb.cnblogs.com/page/69729/1/

先看一个例子

不知道是否有印象 有时候我们从数据库中读出时间后,想输出1988-10-10这样格式的时间时,一般要把string先Convert.ToDateTime然后再.ToString("yyyy-MM-dd");

但是string型的 字符串直接点ToString()是没有这样的功能的

这说明了DateTime和String型的ToString方法是有差异的

string.ToString()的原型

 

 
  
public override string ToString()
{
return this ;
}




 

就是直接甩出自己,因为就是一个字符串(这里不考虑IFormatProvider重载,这无关紧要,下同)

DateTime的ToString()

 

 
  
public override string 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 sealed class String : IComparable, ICloneable, IConvertible, IComparable < string > , IEnumerable < char > , IEnumerable, IEquatable < string >

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()方法

 

未完待续。。。。

             

 

 

 

 

转载于:https://www.cnblogs.com/tutuzhang/archive/2010/11/11/1875069.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值