当前位置:编程学习 > C#/ASP.NET >>

类型自定义格式字符串

引言

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# ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,