它總是適當的,但仔細考慮背後的意圖你顯示
一個更好的問題會是什麼問:
爲什麼一個重寫的ToString()?
ToString()是進入對象狀態的窗口。作爲要求,強調狀態。像Java/C#這樣強大的OOP語言通過將所有內容封裝在一個類中來濫用OOP模型。想象一下,你用一種不遵循強OOP模型的語言來編碼;考慮你是否使用類或函數。如果將它用作函數(即動詞,動作),並且只在輸入/輸出之間暫時維護內部狀態,則ToString()不會添加值。
和其他人一樣,考慮什麼你用ToString()輸出是很重要的,因爲它可以被調試器或其他系統使用。
我喜歡將ToString方法想象成對象的--help參數。它應該是簡短的,可讀的,明顯的,並且易於顯示。它應該顯示什麼對象是而不是它確實。所有這一點讓我們考慮一下......
使用案例 - 解析TCP包:
而不是應用級別唯一的網絡捕獲但更像是一個PCAP捕獲肉的東西。
您只想爲TCP層重載ToString(),以便將數據打印到控制檯。它會包括什麼?你可以去瘋狂並解析所有的TCP細節(即TCP是複雜的)...
其中包括:
- 源端口
- 目標端口
- 序列號
- 確認編號
- 數據偏移量
- 標誌
- 窗口膠印
- 校驗
- 緊急指針
- 選項(我不甚至要去那裏)
但是你想接收所有的垃圾,如果你分別致電TCP.ToString( )100個數據包?當然不會,這會造成信息超載。最簡單的和顯而易見的選擇,也是最明智的...
揭露什麼人希望看到:
我喜歡懂事輸出對於人類來說很容易解析,但是YMMV。
TCP:[destination:000, source:000]
沒有什麼複雜的,輸出不是用於解析的機器(即除非人們濫用你的代碼),其目的是爲了人類的可讀性。
但是我之前提到過的那些多汁信息的其餘部分怎麼樣也沒有用? )我會到,但第一...
的ToString(的所有時間
最有價值的和未充分利用的方法之一,有兩個原因:
- 人不不明白ToString()是什麼
- 基礎'對象'類缺少另一個同樣重要的字符串方法。
原因1 - 不要濫用的ToString的用處():
很多人使用的ToString()拉一個對象的簡單字符串表示。 C#手冊甚至規定:
ToString是.NET Framework中的主要格式化方法。它將對象轉換爲其字符串表示形式,以便適合顯示。
顯示,沒有進一步處理。這並不意味着,拿我上面的TCP數據包的漂亮的字符串表示,並使用正則表達式:: cringe ::來拉取源端口。
right做事情的方法是,直接在SourcePort屬性上調用ToString()(它是一個ushort,所以ToString()應該已經可用)。
如果您需要更強大的功能來打包複雜對象的狀態以進行機器解析,則最好使用結構化序列化策略。
幸運的是,這樣的策略是很常見的:
- ISerializable的(C#)
- 泡菜(蟒蛇)
- JSON(JavaScript或實現任何語言)
- SOAP
- 等...
注意:U您正在使用PHP,因爲HERP-DERP,還有爲::傻笑::
原因2的功能nless - toString()方法是不夠的:
我還沒有看到一個語言以此爲核心,但我已經在野外看到並使用了這種方法的變體。其中一些
包括:
- ToVerboseString()
- 的ToString(詳細=真)
基本上,應該人類要描述的TCP數據包的狀態的那毛狀亂七八糟可讀性。爲了避免「白費口舌」談到TCP在#1情況下,我認爲toString()和ToVerboseString()沒有得到充分利用我「點手指」 ......
使用案例 - 陣列:
如果您主要使用一種語言,那麼您可能對該語言的方法感到滿意。對於像我這樣在不同語言之間跳躍的人來說,不同方法的數量可能令人不快。
也就是說,這讓我惱火的次數大於每個印度教神的所有手指總和的總和。
有various箱子地方語言使用普通hacks和few這get它right。一些需要輪子重新發明,一些做淺轉儲,其他人做深轉儲,沒有一個按照我希望他們的方式工作...
我要求的是一個非常簡單的方法:
輸出: '數組[X]' 或 '陣列[X] [Y]'
其中x是物品的在第一維和y的數量是多少第二維中的項目或表示第二維爲鋸齒狀的某個值(最小/最大範圍可能?)。
和:
print(array.ToVerboseString());
輸出整她,一鼓作氣漂亮地打印,因爲我很欣賞漂亮的東西。
我們希望,這揭示了已經惹惱了我很長一段時間的話題的一些情況。至少我爲PHPers撒了一點點巨魔誘餌來降低這個答案。
取決於如果你真的想用它來隨時隨地在UI中顯示的對象,否則它通常只是用於調試 - 你會看到在VS的監視窗口中的ToString輸出。 (但是你也可以通過類上的屬性來實現它。)假設你有標題和輸出,它看起來像這個程序使用它來使用Console.WriteLine(obj.GetToStringItemsHeadings)轉儲對象。 Console.WriteLine(obj);'或類似的。 – Rup 2012-04-23 09:38:48
我真的不明白這個問題。它可以做不同的事情嗎?是。但是,你爲什麼要*以不同的方式做。 – 2012-04-23 09:38:49
我真的會跳過屬性名稱中的GetToString ...然後你會得到例如'Console.WriteLine(obj.ItemHeadings)' – Svish 2012-04-23 12:09:48