程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Effective C#原則5:始終提供ToString()(2)

Effective C#原則5:始終提供ToString()(2)

編輯:關於C語言

如果你不遵守這一原則裡的其它意見,就 按照上面的方法為你所定義的所有類型重寫該方法。它會直接為每個人省下時間 。

當你負責任的為Object.ToString()方法實現了重寫時,這個類的對象 可以更容易的被添加到Windows Form裡,Web Form裡,或者打印輸出。 .Net的 FCL使用重載的Object.ToString()在控件中顯示對象:組合框,列表框,文本框 ,以及其它一些控件。如果你一個Windows Form或者Web Form裡添加一個 Customer對象的鏈表,你將會得到它們的名字(以文本)顯示出來(譯注:而不是 每個對象都是同樣的類型名)。

Syste.Console.WriteLine()和 System.String.Formate()在內部(實現的方法)是一樣的。任何時候,.Net的FCL 想取得一個customer的字符串說明時,你的customer類型會提供一個客戶的名字 。一個只有三行的簡單函數,完成了所有的基本需求。

這是一個簡單的 方法,ToString()還可以以文字(輸出的方法)滿足很多用戶自定義類型的需求。 但有些時候,你的要求可能會更多。前面的customer類型有三個成員:名字,收 入和聯系電話。對System.Object.ToString()(譯注:原文這裡有誤,掉了 Object)的重寫只使用了_name。你可以通過實現IFormattable(這個接口)來彌補 這個不足。這是一個當你需要對外輸出格式化文本時使用的接口。IFormattable 包含一個重載版的ToString()方法,使用這個方法,你可以為你的類型信息指定 詳細的格式。這也是一個當你要產生並輸出多種格式的字符串時要使用的接口。 customer類就是這種情況,用戶將希望產生一個報表,這個報表包含了已經表格 化了的用戶名和去年的收入。IFormattable.ToString()方法正合你意,它可以 讓用戶格式化輸出你的類型信息。這個方法原型的參數上一包含一個格式化字符 串和一個格式化引擎:

string System.IFormattable.ToString( string format,
  IFormatProvider formatProvider )

你可以為你設計的類型指定要使用的格式字符串。你也可以為你的格式字符 串指定關鍵字符。在這個customer的例子中,你可以完全可以用n來表示名字,r 表示收入以及p來表示電話。這樣一來,你的用戶就可以隨意的組合指定信息, 而你則須要為你的類型提供下面這個版本的的IFormattable.ToString ():

#region IFormattable Members
// supported formats:
// substitute n for name.
// substitute r for revenue
// substitute p for contact phone.
// Combos are supported: nr, np, npr, etc
// "G" is general.
string System.IFormattable.ToString( string format,
  IFormatProvider formatProvider )
{
  if ( formatProvider != null )
  {
   ICustomFormatter fmt = formatProvider.GetFormat(
    this.GetType( ) )
    as ICustomFormatter;
   if ( fmt != null )
    return fmt.Format( format, this, formatProvider );
  }

switch ( format )
 {
  case "r":
   return _revenue.ToString( );
  case "p":
   return _contactPhone;
  case "nr":
    return string.Format( "{0,20}, {1,10:C}",
     _name, _revenue );
  case "np":
   return string.Format( "{0,20}, {1,15}",
    _name, _contactPhone );
  case "pr":
   return string.Format( "{0,15}, {1,10:C}",
     _contactPhone, _revenue );
  case "pn":
    return string.Format( "{0,15}, {1,20}",
     _contactPhone, _name );
  case "rn":
    return string.Format( "{0,10:C}, {1,20}",
     _revenue, _name );
  case "rp":
   return string.Format( "{0,10:C}, {1,20}",
    _revenue, _contactPhone );
  case "nrp":
   return string.Format( "{0,20}, {1,10:C}, {2,15}",
     _name, _revenue, _contactPhone );
  case "npr":
   return string.Format( "{0,20}, {1,15}, {2,10:C}",
    _name, _contactPhone, _revenue );
  case "pnr":
   return string.Format( "{0,15}, {1,20}, {2,10:C}",
    _contactPhone, _name, _revenue );
  case "prn":
   return string.Format( "{0,15}, {1,10:C}, {2,15}",
    _contactPhone, _revenue, _name );
  case "rpn":
   return string.Format( "{0,10:C}, {1,15}, {2,20}",
     _revenue, _contactPhone, _name );
  case "rnp":
   return string.Format( "{0,10:C}, {1,20}, {2,15}",
    _revenue, _name, _contactPhone );
  case "n":
  case "G":
  default:
    return _name;
 }
}
#endregion

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved