类型自定义格式字符串
引言
String可能是使用最多的类型,ToString()则应该是大家使用得最多的方法了。然而它不应该仅仅是用来输出类型的名称,如果使用得当,它可以方便地输出我们对类型自定义的格式。本文将循序渐进地讨论ToString(),以及相关的IFormattable、IFormatProvider以及ICustomFormatter接口。
在类型内部提供自定义格式字符串的能力
继承自System.Object 基类的 ToString()
String是人们直接就可以看懂的数据类型之一,很多情况下我们都会期望能够获得类型的一个字符串输出。因此,Microsoft 在.Net Framework所有类型的基类System.Object中提供了一个虚拟的 ToString()方法,它的默认实现是返回对象的类型名称。
假设我们有这样的一个类型,它定义了“朋友”这一对象的一些信息:
namespace CustomToString
public class Friend {
private string familyName; // 姓
private string firstName; // 名
public Friend(string familyName, string firstName){
this.familyName = familyName;
this.firstName = firstName;
}
public Friend(): this("张","子阳"){}
public string FamilyName {
get { return familyName; }
}
public string FirstName {
get { return firstName; }
}
}
}
当我们在Friend的实例上调用 ToString()方法时,便会返回类型的名称:CustomToString.Friend。
Friend f = new Friend();
Console.WriteLine(f.ToString()); // 输出:CustomToString.Friend
覆盖 ToString() 方法
在上面的例子中,不管类型实例(对象)所包含的数据(字段值)是什么,它总是会返回相同的结果(CustomToString.Friend)。很多时候,返回一个对象的类型名称对我们来说没有多大的意义,拿上面来说,我们可能更加期望能够返回朋友的姓名(famliyName和firstName字段的值)。这时候,我们可以简单地覆盖System.Object基类的ToString()方法,在 Friend 类中添加如下方法:
// 覆盖System.Object基类的 ToString() 方法
public override string ToString() {
return String.Format("Friend: {0}{1}", familyName, firstName);
}
此时,我们再次运行代码:
Friend f = new Friend();
Console.WriteLine(f.ToString()); // 输出:Friend: 张子阳
f = new Friend("王","涛");
Console.WriteLine(f.ToString()); // 输出:Friend: 王涛
可以看到对于不同的对象,ToString()根据对象的字段值返回了不同的结果,这样对我们来说会更加有意义。
重载 ToString() 方法
有时候,我们可能需要将对象按照不同的方式进行格式化。就拿Friend类型来说:易做图人是名在前,姓在后;而中国人是 姓在前,名在后。所以如果运行下面的代码,虽然程序不会出错,但从英语语法角度来看却有问题:
Friend a = new Friend("Zhang", "Jimmy");
Console.WriteLine(a.ToString()); // 输出:Friend: ZhangJimmy
而我们期望输出的是:Jimmy Zhang。这个时候,大家可以想一想想 .Net Framework 解决这个问题采用的方法:重载ToString()。让ToString()方法接收一个参数,根据这个参数来进行格式化。比如 int a = 123; Console.WriteLine(a.ToString("c"));指定了字符串"c"作为参数,产生货币类型的输出:¥123.00。我们也可以使用这种方式来改进Friend类,在Friend中重载一个 ToString() 方法,使之根据一个字符参数来定义其字符串格式化:
// 根据字符串参数来定义类型的格式化
public string ToString(string format) {
switch (format.ToUpper()) {
case "W": // West: 易做图
return String.Format("Friend : {0} {1}", firstName, familyName);
case "E": // East: 东方
return this.ToString();
case "G": // General
default:
return base.ToString();
}
}
然后我们在使用ToString()方法时可以使用重载的版本,对于英文名,我们传入"W"作为参数,这样就解决了上面的问题:
Friend f = new Friend();
Console.WriteLine(f.ToString()); // 输出:Friend: 张子阳
f = new Friend("Zhang", "Jimmy");
Console.WriteLine(f.ToString("W")); // 输出:Friend: Jimmy Zhang
NOTE:这个问题更好的解决办法并非是重载ToString(),可以简单地使用属性来完成,比如这样:
public string WesternFullNa
补充:软件开发 , C# ,