C#:ToString()はどのように実装する必要がありますか? [閉まっている]

StackOverflow https://stackoverflow.com/questions/1404209

  •  05-07-2019
  •  | 
  •  

質問

問題は次のとおりです。

  • GUIライブラリは、クラスのデフォルト表現として ToString を使用します。そこでローカライズする必要があります。
  • ToString はロギングに使用されます。プログラミング関連の情報を提供する必要があり、翻訳されず、サロゲートキーや列挙値などの内部状態が含まれます。
  • ToString は、ストリームへの書き込み時に、たとえば String.Format などのオブジェクトを引数として取る多くの文字列操作で使用されます。コンテキストに応じて、何か異なることが予想されます。
  • 同じオブジェクトの多くの異なる表現がある場合、
  • ToString はあまりにも制限されます。長い形式と短い形式。

使用方法が異なるため、実装にはさまざまな種類があります。そのため、それらはあまりにも信頼性が低いため、実際には役立ちません。

ToString はどのように実装すると便利ですか?いつ ToString を使用する必要があり、いつ使用を避けるべきですか?


.NET Frameworkのドキュメントには次のように記載されています。

  

このメソッドは人間が読める形式を返します   カルチャに依存する文字列。

同様の質問がありますが、同じではありません

役に立ちましたか?

解決

ごく小さなメソッドに大きな期待があるようです:)私の知る限り、クラスごとに振る舞いが異なる場合があるので、特に多くの異なるコンテキストで一般的なメソッドを使用するのは良い考えではありません。

ここに私の提案があります:

1。GUIライブラリにオブジェクトのToString()を使用させないでください。代わりに、より意味のあるプロパティを使用してください(ほとんどすべてのコントロールをカスタマイズして、ToString以外のプロパティを表示できます)。 たとえば、DisplayMemberを使用します。 2.(ロギングまたはその他の用途で)オブジェクトに関する情報を取得するときは、誰かに(別のオブジェクトまたはオブジェクト自体)何を提供し、どのように表示するかを決定させます(戦略パターンが役立つ場合があります)

他のヒント

クラスの意図した使用法に依存します。 多くのクラスには、自然な文字列表現(つまり、Formオブジェクト)がありません。次に、デバッグ時に役立つ有益な情報(フォームテキスト、サイズなど)としてToStringを実装します。 クラスがユーザーに情報を提供することを意図している場合、値のデフォルト表現としてToStringを実装します。たとえば、Vectorオブジェクトがある場合、ToStringはベクトルをXおよびY座標として返す可能性があります。ここで、クラスを記述する他の方法がある場合、代替メソッドも追加します。そのため、ベクターの場合は、説明を角度と長さとして返すメソッドを追加します。

デバッグのために、クラスにDebuggerDisplay属性を追加することもできます。これは、デバッガーでクラスを表示する方法を示しますが、文字列表現には影響しません。

ToStringによって返される値を解析可能にして、文字列表現からオブジェクトを作成できるようにすることを検討することもできます。 Int32.Parseメソッドでできるように。

もう1つ考慮すべき点は、ToStringとVisual Studioのデバッガーとの緊密な統合です。ウォッチウィンドウには、式の値としてToStringの結果が表示されるため、メソッドが遅延読み込みを実行する、副作用がある、または時間がかかる場合、奇妙な動作が見られたり、デバッガーがハングしたように見えることがあります。確かに、これらの品質は適切に設計されたToStringメソッドのマークではありませんが、発生します(たとえば、「データベースから翻訳を取得する」実装)。

その結果、デフォルトのToStringメソッド(パラメーターなし)はVisual Studioのデバッグフックであると考えています-デバッグコンテキスト外のプログラムで使用するために一般的にオーバーロードされるべきではないという意味です。

知識のある人はデバッグ属性(DebuggerTypeProxyAttribute、DebuggerDisplayAttribute、DebuggerBrowsableAttribute)を利用してデバッガーをカスタマイズしますが、多くの(自分を含む)は一般に、ToStringによって生成され、ウォッチウィンドウに表示されるデフォルト出力を十分に考慮します。

これはかなり厳密な観点であることを理解しています-デバッガーフックとしてToStringをオフに書きます-IFormattableを実装する方がより信頼性が高く、拡張可能なルートであるようです。

個人的に、私はそれほど頻繁にToStringを実装しません。多くの場合、型の主な役割はデータではなく動作を定義することであるため、あまり意味がありません。他の場合では、クライアントがそれを必要としないため、それは単純に重要ではありません。

いずれにせよ、これが理にかなっている場合があります(完全なリストではありません):

  • ToStringの結果がデータ損失なしで解析されて型のインスタンスに戻される可能性がある場合。
  • 型に単純な(つまり、複雑ではない)値がある場合。
  • タイプの主な目的がデータをテキストにフォーマットすることである場合。

リストした使用シナリオに矛盾があることに同意しません。表示が主な目的である場合、ToStringはユーザーフレンドリーなテキストを提供する必要がありますが、ロギング(または、説明するように、トレース)の場合、UI固有の要素をトレースするべきではありません。むしろ、詳細なトレースデータを書き込むことを目的とするオブジェクトです。

したがって、単一の責任原則に従って同じタイプであってはならないため、競合はありません。

さらに制御が必要な場合は、ToStringメソッドをいつでもオーバーロードできることに注意してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top