本示例也演示了如果没有重写Object.ToString方法,类型会输出类型名称。
实际上,在第一个版本的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", person, null));
- //第二类格式化输出语法,更简洁
- Console.WriteLine(person.ToString("Ch", pFormatter));
- Console.WriteLine(person.ToString("Eg", pFormatter));
- Console.WriteLine(person.ToString("ChM", pFormatter));
|
相关链接:
改善C#程序的157个建议(连载1)
改善C#程序的157个建议(连载2)
改善C#程序的157个建议(连载3)
改善C#程序的157个建议(连载4)
改善C#程序的157个建议(连载5)
改善C#程序的157个建议(连载6)
改善C#程序的157个建议(连载7)
改善C#程序的157个建议(连载8)
改善C#程序的157个建议(连载9)
改善C#程序的157个建议(连载10)
改善C#程序的157个建议(连载11)
改善C#程序的157个建议(连载12)