2011-08-10 25 views
6

我剛剛遇到一些覆蓋ToString()的代碼,並返回一些關鍵信息(不僅僅是調試信息)。這種類型的用戶稱爲ToString()並解析關鍵數據。應該使用ToString來獲取關鍵信息嗎?

筆者認爲,從歷年閱讀各種點點滴滴,是ToString()有相當薄弱contract,即覆蓋它(如果你想)到顯示一些有意義的東西。

看我說的display there?我遇到的代碼依賴於這種類型的實例的文本表示非常具體;除了預期之外添加任何東西都會導致各種問題。因此,我的問題是,如果對象的文本表示是關鍵的,那麼應該使用ToString()或者應該使用更明確的方法/屬性,例如,使用ToString()AsText

回答

4

我個人分享你的關注。 Microsoft's documentation指出ToString()方法

[...]轉換一個目的是它的字符串表示,使得它適合於顯示器。

Oracle's documentation for Java的Object.toString()甚至小強:

結果應是一個簡明而豐富的表示,這樣便於人們閱讀。

我將這些看作是強烈的跡象,表明ToString()應該傳達對人類有利的信息。返回要由應用程序的其他部分處理的數據的方法應該有更多信息的名稱。在我看來,即使AsText()也是通用的。

6

這似乎是一個非常糟糕的計劃。如果該類型的用戶需要數據,那麼該類型應公開方法來返回該數據。爲什麼人們在訪問對象時解析對象的字符串表示?

當然有序列化的情況,但這些情況都有明確的定義,很少使用.ToString()來完成他們的工作。

如果需要用於非輸出目的的字符串的文本表示,那麼我寧願使用一個單獨的方法(這可能會也可能不會利用ToString()來完成它的工作。)這有助於消費者以及實現者;如果一位新的編碼員想要在ToString()中添加一些調試轉儲信息並打破了該類的使用者,那將是非常不幸的。

UPDATE:作爲MattDavey指出,如果實現IFormattable,那麼這是一個很好的妥協:你的消費者致電ToString(),但在考慮到具體的格式,而這意味着什麼可靠的合同。與你的同事做的事情仍然不同,但是可能更適合他們的選擇。

+1

我完全同意,但會認爲ToString方法可以是一個很好的候選人,以輸出文本數據,只要你的對象實現IFormattable。在那裏有各種數據綁定框架,將IFormattable.ToString比MyCustomTextOutputMethod()..更好用,但這並不是說你不能同時擁有兩個:) – MattDavey

+0

@MattDavey公平點,雖然這是不同的覆蓋標準的'ToString()'方法。不過,我會更新來解決這個問題。 – dlev

+0

是的,強調這兩種方法之間的區別很重要。我喜歡IFormattable的是,在標準實施模式,將Object.ToString推遲到IFormattable.ToString(「G」),它給你一個很好的進程路徑:) – MattDavey

0

在我看來ToString()畢竟是我們可以在任何希望方式來使用它,例如5.ToString()整型轉換爲字符串,並返回它不管它是用於顯示與否,對一個方法相反,在許多情況下,我們是依靠在從int.ToString()返回的信息進行進一步的操作。

1

我不認爲有一個確定的答案。

我會爭論使用ToString()的情況,因爲在.NET中創建API時,使用.NET中的常用命名約定時,我們會感激,而不是使用不太熟悉的名稱,例如AsText()。 該慣例後續例如StringBuilder類,因爲其ToString()正在返回關鍵信息。

+1

同意,同樣的情況適用於System.IO.StringWriter。看來,當對象唯一的目的是生成字符串時,使用ToString方法是公開最終結果的明智方法。 – MattDavey

0

沒問題,你的問題沒有確切的答案。在我看來,像ToStringAsText這樣的方法應該只用於提供對象的內部狀態,例如,記錄它。在面嚮對象語言中,功能方面應該通過使用明確定義的接口來導出,例如, GetOrderIdGetUserName

0

不,我不會那樣做。例如,如果我有一個人物,ToString()可能會返回this.firstname + " " + this.lastname.它將其用於自動顯示目的,如將項目添加到列表框。添加對象時,會顯示該人的姓名。我不認爲我會把重要或敏感的信息放在覆蓋範圍內。

+0

這個規則的一個例外是如果對象實現IFormattable,在這種情況下,ToString方法變得更加靈活和強大,以暴露像這樣的數據... – MattDavey

+0

@MattDavey - 同意 –

1

好問題。

爲了更加明確,我將創建不同格式的不同方法。

例如:toJson() - >對象的JSON表示 toXML() - >對象的XML表示。 ...等

注意:有可能是會替你..在Java中有一個圖書館。不知道在C#

正如你所說,解析的toString()可能會導致問題隨着時間的推移,因爲一個新的開發人員可能不知道的toString()有特定的格式。

相關問題