建议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个建议》陆敏技

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

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

网易有道9-13北邮笔试题:输入字符串,将字符串里的*用0或1替换,输出所有可能的字符串

输入字符串,将字符串里的*用0或1替换,输出所有可能的字符串。
  • muhudie
  • muhudie
  • 2014年09月13日 22:01
  • 502

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

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

建议1 正确操作字符串

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

建议1: 正确操作字符串

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

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

作者:刘某人程序员 博客:http://blog.csdn.net/qq_26787115 声明:未经原作者允许请勿转载 我们从今天就开始正式的学习PY交易了,PY交易还行,我们有基础之后学习起...

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

Python入门(二)——IDE选择PyCharm,输入和输出,基础规范,数据类型和变量,常量,字符串和编码,格式化我们从今天就开始正式的学习PY交易了,PY交易还行,我们有基础之后学习起来倒不是说那...

(1) Python 内置类型 –- 字符串

概  述:Python字符串 – 一个有序的字符集合,用于存储和表现基于文本的信息。 1 字符串 1.1 单引号、双引号、三引号和转义引号 单引号和双引号没有区别;三重引号编写多行字符串块;...

Python之路Part4--数据类型1(数字、字符串)

列表 序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。 Python有6个序列的内置类型,但最常见的是列表和元...

1. Oracle内置数据类型--字符串, 2. char的大小和字符集有关

Oracle 数据分为四类 --Oracle_built_in_datatypes  内置数据 --ANSI_supported_datatypes   --user_defined...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:建议13: 为类型输出格式化字符串(1)
举报原因:
原因补充:

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