建议13: 为类型输出格式化字符串(1)
2016-08-30 17:25
204 查看
建议13: 为类型输出格式化字符串(1)
有两种方法可以为类型提供格式化的字符串输出。一种是意识到类型会产生格式化字符串输出,于是让类型继承接口IFormattable。这对类型来说,是一种主动实现的方式,要求开发者可以预见类型在格式化方面的要求。更多的时候,类型的使用者需为类型自定义格式化器,这就是第二种方法,也是最灵活多变的方法,可以根据需求的变化为类型提供多个格式化器。下面就来详细介绍这两种方法。
最简单的字符串输出是为类型重写ToString方法,如果没有为类型重写该方法,默认会调用Object的ToString方法,它会返回当前类型的类型名称。但即使是重写了ToString方法,提供的字符串输出也是非常单一的,而通过实现IFormattable接口的ToString方法,可以让类型根据用户的输入而格式化输出。如下面这个类型Person,它本身提供了属性FirstName和LastName。现在,根据中文和英文语言地区的习惯,提供的ToString方法要支持输出“Hu Jessica”或 “Jessica
Hu”,实现代码应该如下所示:
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();
}
}
//重写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);
Console.WriteLine(person.ToString("Ch", null));
Console.WriteLine(person.ToString("Eg", null));
输出为:
Hu Jessica
Hu Jessica
Jessica Hu
上面这种方法是在意识到类型会存在格式化字符串输出方面的需求时,提前为类型继承了接口IFormattable。如果类型本身没有提供格式化输出的功能,这个时候,格式化器就派上了用场。格式化器的好处就是可以根据需求的变化,随时增加或者修改它。假设Person类如以下所示的实现。
class Person
{
public string IDCode { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
针对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
}
转自:《编写高质量代码改善C#程序的157个建议》陆敏技
有两种方法可以为类型提供格式化的字符串输出。一种是意识到类型会产生格式化字符串输出,于是让类型继承接口IFormattable。这对类型来说,是一种主动实现的方式,要求开发者可以预见类型在格式化方面的要求。更多的时候,类型的使用者需为类型自定义格式化器,这就是第二种方法,也是最灵活多变的方法,可以根据需求的变化为类型提供多个格式化器。下面就来详细介绍这两种方法。
最简单的字符串输出是为类型重写ToString方法,如果没有为类型重写该方法,默认会调用Object的ToString方法,它会返回当前类型的类型名称。但即使是重写了ToString方法,提供的字符串输出也是非常单一的,而通过实现IFormattable接口的ToString方法,可以让类型根据用户的输入而格式化输出。如下面这个类型Person,它本身提供了属性FirstName和LastName。现在,根据中文和英文语言地区的习惯,提供的ToString方法要支持输出“Hu Jessica”或 “Jessica
Hu”,实现代码应该如下所示:
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();
}
}
//重写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);
Console.WriteLine(person.ToString("Ch", null));
Console.WriteLine(person.ToString("Eg", null));
输出为:
Hu Jessica
Hu Jessica
Jessica Hu
上面这种方法是在意识到类型会存在格式化字符串输出方面的需求时,提前为类型继承了接口IFormattable。如果类型本身没有提供格式化输出的功能,这个时候,格式化器就派上了用场。格式化器的好处就是可以根据需求的变化,随时增加或者修改它。假设Person类如以下所示的实现。
class Person
{
public string IDCode { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
针对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
}
转自:《编写高质量代码改善C#程序的157个建议》陆敏技
相关文章推荐
- 建议13: 为类型输出格式化字符串(2)
- 编写高质量代码改善C#程序的157个建议[为类型输出格式化字符串、实现浅拷贝和深拷贝、用dynamic来优化反射]
- 编写高质量代码改善C#程序的157个建议[为类型输出格式化字符串、实现浅拷贝和深拷贝、用dynamic来优化反射]
- Tip13 为类型输出格式化字符串
- 编写高质量代码改善C#程序的157个建议——建议13: 为类型输出格式化字符串
- Python入门(二)——IDE选择PyCharm,输入和输出,基础规范,数据类型和变量,常量,字符串和编码,格式化
- Java.util.Date类型格式化输出和字符串转Date类型
- Python入门(二)——IDE选择PyCharm,输入和输出,基础规范,数据类型和变量,常量,字符串和编码,格式化
- Java.util.Date类型格式化输出和字符串转Date类型
- python基本数据类型(三)-字符串拼接-格式化输出-深浅复制-python3笔记
- 字符串类型的日期(包含CST)格式化输出
- MessageFormat对象实现格式化字符串输出,类似C#中的string.format方法
- 关于sprintf和snprintf格式化字符串输出到字符串缓冲区
- 【转】C++标准库中用来计算时间差的函数 C++标准库用来格式化输出时间字符串
- symbian 字符串描述符格式化format输出转换
- 格式化XML:输出有缩进效果的XML字符串
- 输入一个字符串,将其逆序后输出。(使用C++,不建议用伪码)
- C# 字符串 格式化 补齐输出
- 格式化XML:输出有缩进效果的XML字符串
- [学习笔记][C++Primer Plus]使用cout格式化输出字符串,3q xuzhong