文章目錄
- 實現IFormattable介面
- IFormatProvider介面
ToString()方法作為.NET環境中最常用的方法之一,我們應該為類型的所有者提供一個合理的ToString()版本,類型的字串表示可用來在不同的環境下向使用者輕鬆顯示對象的相關資訊;此外,類型的字串表示還可以擁有調試環境。因此,我們建立的每一個類型都應該能覆寫Object類的ToString()方法。如果建立的是更負責的類型,那麼還應該實現更加完備的IFormattable.ToString()方法。
System.Ojbetc預設提供的ToString()方法會傳回型別的完整名稱。就像:"System.Drawing.Rect"、"System.Data.Common.DbConnection",這一般沒什麼用處,也不適合直接顯示給使用者。所以我們只需要重寫一次,即可一勞永逸。
通過一個樣本我們來學習如何為一個類型提供一個容易理解的,文本方式的表示。例如我們有一個包含三個欄位的Customer類:
1 class Customer 2 { 3 /// <summary> 4 /// 姓名 5 /// </summary> 6 public string Name 7 { 8 get; 9 set;10 }11 12 /// <summary>13 /// 收入14 /// </summary>15 public decimal Revenue16 {17 get;18 set;19 }20 21 /// <summary>22 /// 聯絡電話23 /// </summary>24 public string ContactPhone25 {26 get;27 set;28 }29 30 /// <summary>31 /// 覆寫ToString方法,提供該類型更易理解的文本表示方式32 /// </summary>33 /// <returns></returns>34 public override string ToString()35 {36 return Name;37 }38 }
對於Customer類來說,返回它的Name是一個不錯的選擇。在提供了Customer類的ToString()覆寫之後,該類的對象即可更容易的添加到WPF控制項、Silverlight控制項、Web Forms控制項或者被列印輸出。.NET BCL(.NET Framework 基礎類庫)在將對象顯示到如組合框、列表框、文字框或其他控制項上時使用Object.ToString()的覆寫版本。
提示:
在C#3.0中,編譯器會為所以匿名型別建立一個預設的ToString()方法。該預設方法將顯示對象中的每個屬性值。
例如我們運行控制台程式:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 int[] list = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 6 var test = new { Name = "me", Numbes = from li in list select 1 }; 7 8 Console.WriteLine(test); 9 Console.Read();10 }11 }
運行程式:
實現IFormattable介面
雖然簡單的ToString()方法很多時候已經可以滿足使用者自訂類型顯示文本資訊的需求,但有時還需要提供更強的方法。在前面的Customer類的ToString()方法中我們只是簡單的返回了它的Name這個欄位。如果我們想要擁有更加詳細的返回,我們可以通過覆寫IFormattable介面來解決這個不足。該介面包含了一個重載的ToString()方法,它允許我們為類型提供特定的格式資訊。當你需要為類型輸出不同形式的字串時,這個介面即可大顯身手。在下面的例子中我們可以使用特定的字串來表示某種格式的資訊,如n來表示名稱等:
1 public class Customer : IFormattable 2 { 3 //屬性欄位省略... 4 5 public string ToString(string format, IFormatProvider formatProvider) 6 { 7 if (formatProvider != null) 8 { 9 ICustomFormatter fmt = formatProvider.GetFormat(this.GetType()) as ICustomFormatter;10 if (fmt != null)11 return fmt.Format(format, this, formatProvider);12 }13 switch (format)14 {15 case "r":16 return Revenue.ToString();17 case "p":18 return ContactPhone;19 case "nr":20 return string.Format("{0,20},{1,10:C}", Name, Revenue);21 case "np":22 return string.Format("{0,15},{1,10:C}", Name, ContactPhone);23 case "n":24 case "G":25 default:26 return Name;27 }28 }29 }
Customer使用者即可自訂其想要輸出的格式:
1 IFormattable c1 = new Customer();2 Console.WriteLine("Customer record:{0}", c1.ToString("nr", null));
首先我們必須支援表示通用格式的"G";其次我們必須支援兩種格式的空格式,即" "和null。這三種格式返回字串都必須和Ojbect.ToString()的覆寫版本的字串相同。實現了IFormattable介面的類型,.NET BCL都會調用IFormattable()而不是Object.ToString()。
IFormatProvider介面
IFormattable.ToString()方法的第二個參數是一個實現IFormatProvider介面的對象,該對象允許用戶端提供一些我們無法事先預料的格式化選項。更詳細的說明參見:IFormatProvider介面
小節:
人們總是要通過某種方式擷取到類型的資訊,而字串的表示則是最通俗易懂的。因此,我們應該覆寫所以類型中的ToString()方法,讓其簡單明了的輸出對象的摘要資訊。
閱讀書目:《Effective C#》
擴充閱讀:
標準數字格式字串
自訂數字格式字串