5、始终为自定义的类或结构提供ToString()

      ToString()方法:是获取对象的字符串表示的一种便捷方式。为了方便用户,我们应该给自定义类重写ToString()函数,使ToString()的返回值更加贴近类对象的意义。如果不重写ToString()函数会怎样?众所周知,在.net环境下,所有的类都继承自System.Object类,如果不重写ToString()函数,自然会调用Object类的ToString()函数:

1 public virtual string ToString()
2 {
3     return this.GetType().FullName;
4 }
5 

    从代码可以看出,返回的仅仅是对象的类型名而已,对于用户来说没有多大意义。

    下面我们来看下微软是怎么做的。

    如下所示:Windows FormListBox类的ToString()函数

Code


   就像微软做的这样,我们在为自定义类重写ToString()函数时,应该考虑该类对象的实际意义和给用户的最直观的信息。

但是对于一些稍微复杂的类对象,由于它的信息比较复杂,单靠一个简单的ToString()函数是不能满足用户的需要。比如System.DateTime。由于各地的文化差异,使得有些地区之间的时间格式不一样,另外由于DateTime的信息比较复杂,不仅包括年、月、日还有分、秒、时,这时一个简单的ToString()函数是无法满足要求的。那么System.DateTime是怎么实现的?

首先介绍下面几个接口:ICustomFormatterIFormatProvider以及IFormattable
1、ICustomFormatter。定义一种方法,它支持对象值的自定义(用户定义)格式设置。它的定义如下:

1 public interface ICustomFormatter
2 {
3  // Methods
4     string Format(string format, object arg, IFormatProvider formatProvider);
5 }


      Format函数中有一IFormatProvider参数,那么IFormatProvider又是怎样的?

2、IFormatProvider返回一个对象,该对象为指定类型提供格式设置服务。它的定义如下:

1 public interface ICustomFormatter
2 {
3  // Methods
4     string Format(string format, object arg, IFormatProvider formatProvider);
5 }

3IFormattable提供将对象的值格式化为字符串表示形式的功能。它的定义如下:

1 public interface IFormattable
2 {
3     // Methods
4     string ToString(string format, IFormatProvider formatProvider);
5 }


        ToString函数中也有一IFormatProvider参数。

    接口是定义规则的,现在规则知道了,那么应该怎么样使用呢?

    下面举一个简单的SimpleDateTime类加以说明。

 

Code

     
      如果想偷懒,认为这些格式转换已经能满足用户的需要,不需要用户利用IFormatProvider扩展格式转换了,那么SimpleDateTime自定义类完全可以不用继承接口:IFormattable,实现string ToString(string format, IFormatProvider formatProvider),只需将函数string ToString(string format)改写成如下形式就可以了。

Code

      这样做是不负责任的。一旦不能满足用户格式转换的需要,用户就毫无办法了,所以我们还是勤快点,将自定义的类继承接口:IFormattable,实现string ToString(string format, IFormatProvider formatProvider)。这样,当用户需要扩展格式转换时,可以按要求实现ICustomFormatterIFormatProvider接口,就可以达到用户想要的目的了。如下所示:

Code

     
      如此:SimpleDateTime类比较灵活的实现了时间的多种格式输出,用户也可以按照要求实现各种格式输出了。由此我们可以大致了解到System.DateTime类的ToString函数是如何实现的。
      总之:不管怎样,我们都要为我们自定义的类负责,为该类提供合理的ToString函数。

posted @ 2009-08-12 22:10  驹无尚者  阅读(831)  评论(0编辑  收藏  举报