改善C#程序的157个建议(连载13)

发表于:2011-11-02 09:52

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:陆敏技    来源:51Testing软件测试网采编

  建议13:为类型输出格式化字符串

  有两种方法可以为类型提供格式化的字符串输出。一种是意识到类型会产生格式化字符串输出,于是让类型继承接口IFormattable。这对类型来说,是一种主动实现的方式,要求开发者可以预见类型在格式化方面的要求。更多的时候,类型的使用者需为类型自定义格式化器,这就是第二种方法,也是最灵活多变的方法,可以根据需求的变化为类型提供多个格式化器。下面就来详细介绍这两种方法。

  最简单的字符串输出是为类型重写ToString方法,如果没有为类型重写该方法,默认会调用Object的ToString方法,它会返回当前类型的类型名称。但即使是重写了ToString方法,提供的字符串输出也是非常单一的,而通过实现IFormattable接口的ToString方法,可以让类型根据用户的输入而格式化输出。如下面这个类型Person,它本身提供了属性FirstName和LastName。现在,根据中文和英文语言地区的习惯,提供的ToString方法要支持输出“Hu Jessica”或 “Jessica Hu”,实现代码应该如下所示:

  1. class Person : IFormattable  
  2. {  
  3.     public string IDCode { get; set; }  
  4.     public string FirstName { get; set; }  
  5.     public string LastName { get; set; }  
  6.     //实现接口IFormattable的方法ToString  
  7.     public string ToString(string format, IFormatProvider formatProvider)  
  8.     {  
  9.         switch (format)  
  10.         {  
  11.             case "Ch":  
  12.                 return this.ToString();  
  13.             case "Eg":  
  14.                 return string.Format("{0} {1}", FirstName, LastName);  
  15.             default:  
  16.                 return this.ToString();  
  17.         }  
  18.     }  
  19.     //重写Object.ToString()  
  20.     public override string ToString()  
  21.     {  
  22.         return string.Format("{0} {1}", LastName, FirstName);  
  23.     }  
  24. }

  调用者代码如下所示:

  1. Person person = new Person() { FirstName = "Jessica"LastName = "Hu",  
  2.     IDCode = "NB123" };  
  3. Console.WriteLine(person);  
  4. Console.WriteLine(person.ToString("Ch", null));  
  5. Console.WriteLine(person.ToString("Eg", null));

  输出为:

  1. Hu Jessica  
  2. Hu Jessica  
  3. Jessica Hu

  上面这种方法是在意识到类型会存在格式化字符串输出方面的需求时,提前为类型继承了接口IFormattable。如果类型本身没有提供格式化输出的功能,这个时候,格式化器就派上了用场。格式化器的好处就是可以根据需求的变化,随时增加或者修改它。假设Person类如以下所示的实现。

  1. class Person  
  2. {  
  3.     public string IDCode { get; set; }  
  4.     public string FirstName { get; set; }  
  5.     public string LastName { get; set; }  
  6. }

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号