[英]Should I override string cast or ToString method?
如果我要創建一個從根本上包含字符串消息但也包含與字符串消息關聯的有用數據的類,那么是否有任何理由我應該重寫ToString()方法,而不是定義對字符串的強制轉換以獲取對象的內部字符串信息?
例如,我有一個名為msg的Message對象,其text == "Hello"
但其中也包含有關文本來源的信息。 我想要Console.WriteLine(msg);
輸出"Hello"
。 我應該重寫ToString()
還是定義強制轉換為字符串?
您應該重寫ToString
方法。
首先: Console.WriteLine
接受object
並從中調用ToString
方法。
其次:在將來的某個時候,您可能需要創建從Message
派生的類。 讓我們看一下:
using System;
using System.IO;
namespace Namespace
{
class StringCastBase
{
public static explicit operator string(StringCastBase o)
{
return "string cast base";
}
}
class StringCastDerived : StringCastBase
{
public static explicit operator string(StringCastDerived o)
{
return "string cast derived";
}
}
class ToStringOverridenBase
{
public override string ToString()
{
return "ToString overriden base";
}
}
class ToStringOverridenDerived : ToStringOverridenBase
{
public override string ToString()
{
return "ToString overriden derived";
}
}
class Programm
{
public static void Main()
{
StringCastBase scb = new StringCastBase();
Console.WriteLine((string)scb);
StringCastBase scd = new StringCastDerived();
Console.WriteLine((string)scd);
ToStringOverridenBase tsob = new ToStringOverridenBase();
Console.WriteLine(tsob);
ToStringOverridenBase tsod = new ToStringOverridenDerived();
Console.WriteLine(tsod);
}
}
}
輸出將是
弦線鑄造基地
弦線鑄造基地
ToString重寫的基礎
ToString重寫派生
由於scd
的靜態類型為StringCastBase
,因此將調用StringCastBase
的轉換方法(即使動態類型不是StringCastBase
)。 使用虛擬方法ToString
解決了此問題。
我會說最好的技術是讓您的類實現一個名為(例如)“ Text”的只讀屬性,該屬性提供主字符串。 您已經說過,該類包含消息文本之外的其他信息-因此,獲取文本意味着從類中提取該數據。 這正是物業的目的!
為了方便起見,我可能還會重寫ToString()-為了(a)協助調試,並且(b)確保如果ToString()被其他方法(例如Console.WriteLine())調用,則返回有意義的東西-正如他在回答中提到的那樣。 請記住,ToString()的目的是提供對象的字符串表示形式,因此您可能會考慮是否要讓ToString()僅返回主文本,或者是否希望它提供其他信息的指示該對象也包含。
在這種情況下,我絕對不會使用演員表。 從語義上來說,您所做的事情是錯誤的。 強制轉換表示您正在將數據從一種類型轉換為另一種類型。 但這不是您正在做的-您想從類中提取特定的數據(主要文本)。 為此目的使用演員表可能會使其他開發人員感到困惑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.