如果你不遵守這一原則裡的其它意見,就 按照上面的方法為你所定義的所有類型重寫該方法。它會直接為每個人省下時間 。
當你負責任的為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