6

ToString()いくつかの重要な情報(デバッグ情報だけでなく)をオーバーライドして返すコードに出くわしました。このタイプのユーザーは、ToString()その重要なデータを呼び出して解析します。

私の意見は、何年にもわたってさまざまな断片を読んだことから、それToString()はかなり弱い、つまり、意味のあるものを表示するために(必要に応じてcontractオーバーライドするというものです。

私がそこに表示すると言ったのを参照してください?私が出くわしたコードは、このタイプのインスタンスのテキスト表現に非常に具体的であることに依存していました。予想以外のものを追加すると、あらゆる種類の問題が発生します。

したがって、私の質問は、オブジェクトのテキスト表現が重要である場合、ToString()使用する必要があるか、またはより明示的なメソッド/プロパティを使用する必要があるAsTextかどうかです。

4

7 に答える 7

6

これはかなり悪い計画のようです。タイプのユーザーがデータを必要とする場合、そのタイプはそのデータを返すためのメソッドを公開する必要があります。オブジェクトにアクセスできるのに、なぜ人々はオブジェクトの文字列表現を解析するのですか?

もちろんシリアル化のシナリオもありますが、それらは明確に定義され.ToString()ており、仕事をするために使用されることはめったにありません。

非出力目的の文字列のテキスト表現が必要な場合は、別の方法をお勧めします(ToString()その仕事をするために利用する場合としない場合があります)。これは、実装者だけでなく消費者にも役立ちます。ToString()新しいコーダーがデバッグダンプ情報を追加してクラスのコンシューマーを壊したいと思ったら、それは本当に残念なことです。

更新:MattDaveyが指摘しているように、実装する場合IFormattable、それは良い妥協案です。消費者は電話ToString()をかけますが、特定の形式を念頭に置いて、それが何を意味するかについての信頼できる契約を結んでいます。同僚がしていることとはまだ異なりますが、おそらく彼らにとってより受け入れやすいオプションです。

于 2011-08-10T15:15:08.660 に答える
4

個人的に私はあなたの懸念を共有します。Microsoftのドキュメントには、このToString()方法は

[...]オブジェクトを文字列表現に変換して、表示に適したものにします。

Javaに関するOracleのドキュメントObject.toString()はさらに少し強力です。

結果は、人が読みやすい簡潔で有益な表現になるはずです。

ToString()これらは、人間にとって便利な情報を伝えるべき強い兆候だと思います。アプリケーションの他の部分によって操作されるデータを返すメソッドには、よりわかりやすい名前を付ける必要があります。私の意見でAsText()は、あまりにも一般的です。

于 2011-08-10T15:28:25.703 に答える
1

明確な答えはないと思います。

ToString().NETでAPIを作成するときは、.NETなどのあまり馴染みのない名前を使用する代わりに、.NETで一般的な命名規則を使用するとよいので、を使用する場合について議論しますAsText()StringBuilderこの規則は、ToString()重要な情報を返すため、たとえばクラスが従います。

于 2011-08-10T15:17:11.097 に答える
1

良い質問。

もっと明確にするために、私は異なるフォーマットのために異なるメソッドを作成します。

例:toJson()->オブジェクトのJSON表現toXML()->オブジェクトのXML表現。...等

注:おそらくあなたのためにそれを行うライブラリがあります..Javaにはあります。C#でわからない

あなたが言うように、toString()を解析すると、時間の経過とともに問題が発生する可能性があります。これは、新しい開発者がtoString()が特定の形式であることを知らない場合があるためです。

于 2011-08-10T15:19:17.627 に答える
0

私の意見ToString()では、結局のところ、それを任意の望ましい方法で使用できる方法です。たとえば5.ToString()、intを文字列に変換し、表示に使用するかどうかに関係なく、逆に、多くの状況で依存しint.ToString()ています。さらなる操作を行うために返されるその情報について。

于 2011-08-10T15:15:57.603 に答える
0

質問はありません。あなたの質問に対する明確な答えはありません。私の意見では、オブジェクトの内部状態を提供するため、たとえばログに記録するためにのみ、ToStringまたはのようなメソッドを使用する必要があります。オブジェクト指向言語では、機能的側面は、明確に定義されたインターフェースを使用して導出する必要があります。AsTextGetOrderIdGetUserName

于 2011-08-10T15:17:32.657 に答える
0

いいえ、私はそれをしません。たとえば、人物オブジェクトがある場合 、リストボックスにアイテムを追加するなど、自動表示の目的で使用しているとToString()返される可能性があります。this.firstname + " " + this.lastname.オブジェクトが追加されると、人の名前が表示されます。重要な情報や機密情報をオーバーライドに入れることはないと思います。

于 2011-08-10T15:18:23.820 に答える