编写高质量C#代码学习笔记(4)
来源:互联网 发布:淘宝自动充值软件 编辑:程序博客网 时间:2024/05/19 18:42
建议13: 为类型输出格式化字符串
针对Person的格式化器的实现为:
- class PersonFomatter : IFormatProvider, ICustomFormatter
- {
- #region IFormatProvider 成员
- public object GetFormat(Type formatType)
- {
- if (formatType == typeof(ICustomFormatter))
- return this;
- else
- return null;
- }
- #endregion
- #region ICustomFormatter 成员
- public string Format(string format, object arg,
- IFormatProvider formatProvider)
- {
- Person person = arg as Person;
- if (person == null)
- {
- return string.Empty;
- }
- switch (format)
- {
- case "Ch":
- return string.Format("{0} {1}", person.LastName,
- person.FirstName);
- case "Eg":
- return string.Format("{0} {1}", person.FirstName,
- person.LastName);
- case "ChM":
- return string.Format("{0} {1} : {2}", person.LastName,
- person.FirstName, person.IDCode);
- default:
- return string.Format("{0} {1}", person.FirstName,
- person.LastName);
- }
- }
- #endregion
实际上,在第一个版本的Person类型中,如果对IFormattable的ToString方法稍作修改,就能让格式化输出在语法上支持更多的调用方式。注意看Person类型的最终版本中ToString方法的switch结构的default部分,如下所示。
- class Person : IFormattable
- {
- public string IDCode { get; set; }
- public string FirstName { get; set; }
- public string LastName { get; set; }
- //实现接口IFormattable的方法ToString
- public string ToString(string format, IFormatProvider formatProvider)
- {
- switch (format)
- {
- case "Ch":
- return this.ToString();
- case "Eg":
- return string.Format("{0} {1}", FirstName, LastName);
- default:
- //return this.ToString();
- ICustomFormatter customFormatter = formatProvider
- as ICustomFormatter;
- if (customFormatter == null)
- {
- return this.ToString();
- }
- return customFormatter.Format(format, this, null);
- }
- }
- //重写Object.ToString()
- public override string ToString()
- {
- return string.Format("{0} {1}", LastName, FirstName);
- }
- }
最终,调用者的代码能够支持如下所示的语法:
- Person person = new Person() { FirstName = "Jessica", LastName = "Hu",
- IDCode = "NB123" };
- Console.WriteLine(person.ToString());
- PersonFomatter pFormatter = new PersonFomatter();
- //第一类格式化输出语法
- Console.WriteLine(pFormatter.Format("Ch", person, null));
- Console.WriteLine(pFormatter.Format("Eg", person, null));
- Console.WriteLine(pFormatter.Format("ChM",
- //第二类格式化输出语法,更简洁
- Console.WriteLine(person.ToString("Ch", pFormatter));
- Console.WriteLine(person.ToString("Eg", pFormatter));
- Console.WriteLine(person.ToString("ChM", pFormatter));
- 编写高质量C#代码学习笔记(4)
- 编写高质量C#代码学习笔记(1)
- 编写高质量C#代码学习笔记(2)
- 编写高质量C#代码学习笔记(3)
- 编写高质量C#代码学习笔记(5)
- 编写高质量C#代码学习笔记(6)
- 编写高质量代码、学习笔记——CSS篇
- 编写高质量代码、学习笔记——Javascript篇
- 编写高质量代码(4)
- 编写高质量C#代码(5)
- 编写高质量代码:改善Java程序的151个建议-学习笔记(1-4章)
- 编写高质量代码:改善Java程序的151个建议-学习笔记(1-4章)
- 《构建高质量的C#代码》学习笔记
- 编写高质量代码——笔记
- 编写高质量代码
- 编写高质量代码
- 更锋利的C#代码--编写高质量C#程序
- 《编写高质量代码改善C#程序的157个建议》学习
- 做备忘录收获
- 壹百度—百度十年千倍的29条法则
- C++沉思录读书笔记(29章)- 应用器,操纵器和函数对象
- 还原java的今生和前世!
- offset与lea
- 编写高质量C#代码学习笔记(4)
- 用C#编写ActiveX控件(一)
- 光棍节之分享
- java中Thread类中的start()方法与run()方法
- 解决办法:mysql_connect()不支持请检查mysql模块是否正确加载
- 能力的内涵
- javascript 直接创建对象与间接创建对象 私有函数不能访问this变量 是否使用var声明变量几个问题探讨
- 正定对称矩阵快速求解
- 用C#编写ActiveX控件(二)