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

转载 2016年08月30日 17:25:35

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

有两种方法可以为类型提供格式化的字符串输出。一种是意识到类型会产生格式化字符串输出,于是让类型继承接口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.  
  7.     //实现接口IFormattable的方法ToString  
  8.     public string ToString(string format, IFormatProvider formatProvider)  
  9.     {  
  10.         switch (format)  
  11.         {  
  12.             case "Ch":  
  13.                 return this.ToString();  
  14.             case "Eg":  
  15.                 return string.Format("{0} {1}", FirstName, LastName);  
  16.             default:  
  17.                 return this.ToString();  
  18.         }  
  19.     }  
  20.  
  21.     //重写Object.ToString()  
  22.     public override string ToString()  
  23.     {  
  24.         return string.Format("{0} {1}", LastName, FirstName);  
  25.     }  

调用者代码如下所示:

  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; }  

针对Person的格式化器的实现为:
  1. class PersonFomatter : IFormatProvider, ICustomFormatter  
  2. {  
  3.  
  4.     #region IFormatProvider 成员  
  5.  
  6.     public object GetFormat(Type formatType)  
  7.     {  
  8.         if (formatType == typeof(ICustomFormatter))  
  9.             return this;  
  10.         else  
  11.             return null;  
  12.     }  
  13.  
  14.     #endregion  
  15.  
  16.     #region ICustomFormatter 成员  
  17.  
  18.     public string Format(string format, object arg,  
  19.         IFormatProvider formatProvider)  
  20.     {  
  21.         Person person = arg as Person;  
  22.         if (person == null)  
  23.         {  
  24.             return string.Empty;  
  25.         }  
  26.  
  27.         switch (format)  
  28.         {  
  29.             case "Ch":  
  30.                 return string.Format("{0} {1}", person.LastName,  
  31.                     person.FirstName);  
  32.             case "Eg":  
  33.                 return string.Format("{0} {1}", person.FirstName,  
  34.                     person.LastName);  
  35.             case "ChM":  
  36.                 return string.Format("{0} {1} : {2}", person.LastName,  
  37.                     person.FirstName, person.IDCode);  
  38.             default:  
  39.                 return string.Format("{0} {1}", person.FirstName,  
  40.                     person.LastName);  
  41.         }  
  42.     }  
  43.  
  44.     #endregion  

转自:《编写高质量代码改善C#程序的157个建议》陆敏技

相关文章推荐

建议14: 正确实现浅拷贝和深拷贝

建议14: 正确实现浅拷贝和深拷贝 为对象创建副本的技术称为拷贝(也叫克隆)。我们将拷贝分为浅拷贝和深拷贝。 浅拷贝 将对象中的所有字段复制到新的对象(副本)中。其中,值类型字段的值被复制到副本中...
  • houwc
  • houwc
  • 2016-08-31 10:38
  • 145

改善C#程序的50种方法

为什么程序已经可以正常工作了,我们还要改变它们呢?答案就是我们可以让它们变得更好。我们常常会改变所使用的工具或者语言,因为新的工具或者语言更富生产力。如果固守旧有的习惯,我们将得不到期望的结果。对于C...

建议11: 区别对待==和Equals

建议11: 区别对待==和Equals 在开始本建议之前,首先要明确概念“相等性”。CLR中将“相等性”分为两类:“值相等性”和“引用相等性”。如果用来比较的两个变量所包含的数值相等,那么将其定义为...
  • houwc
  • houwc
  • 2016-08-30 15:36
  • 225

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

建议13: 为类型输出格式化字符串(2) 一个典型的格式化器应该继承接口IFormatProvider和ICustomFomatter,所以应该像下面这样调用格式化器: Person person...
  • houwc
  • houwc
  • 2016-08-31 10:31
  • 161

建议12: 重写Equals时也要重写GetHashCode

建议12: 重写Equals时也要重写GetHashCode 除非考虑到自定义类型会被用作基于散列的集合的键值;否则,不建议重写Equals方法,因为这会带来一系列的问题。 如果编译上一个建议中的...
  • houwc
  • houwc
  • 2016-08-30 17:10
  • 408

Tip13 为类型输出格式化字符串

Tip13 为类型输出格式化字符串 有两种方法为类型提供格式化的字符串输出: 1、让类型继承接口IFormattable。(需要预见类型在格式化方面的需求) 2、让类型继承接口IFormatPr...

《每天一算法》17/1/13--求字符串最后一个单词的长度

问题:一串字符串,求其最后一个单词的长度 分析 思路一:因为单词之间是通过“ ”(空格)来划分的,所以可以使用正则表达式对“ ”进行分割,创建由各个单词组成的数组,然后取最后一个数组求其长度; ...

建议1 正确操作字符串

字符串是我们常用的基础数据类型,如果使用不当,养成不好的习惯,会对程序造成额外的开销。 建议: 确保尽量少的装箱 避免分配额外的内存空间 确保尽量少的装箱 1:String str1 = "str1"...

建议1: 正确操作字符串

建议1: 正确操作字符串 字符串应该是所有编程语言中使用最频繁的一种基础数据类型。如果使用不慎,我们就会为一次字符串的操作所带来的额外性能开销而付出代价。本条建议将从两个方面来探讨如何规避这类性能开...
  • houwc
  • houwc
  • 2016-08-26 17:47
  • 367

Python入门(二)——IDE选择PyCharm,输入和输出,基础规范,数据类型和变量,常量,字符串和编码,格式化

Python入门(二)——IDE选择PyCharm,输入和输出,基础规范,数据类型和变量,常量,字符串和编码,格式化我们从今天就开始正式的学习PY交易了,PY交易还行,我们有基础之后学习起来倒不是说那...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)