8

メソッドから 2 つまたは 3 つの回答を得るというこの問題に、他の開発者がどのように取り組んでいるのか気になります。

1) object[] を
返す 2) カスタム クラスを返す
3) 複数の変数で out または ref キーワードを使用する
4) 単純な Tuple<> ジェネリック クラスを作成または借用 (F#) する
​​ http://slideguitarist.blogspot.com/2008 /02/whats-f-tuple.html

現在、データの更新を行うコードに取り組んでいます。リフレッシュを行うメソッドから、(1) Refresh Start Time と (2) Refresh End Time を返したいと思います。
後日、3 番目の値を返したいと思うかもしれません。

考え?このトピックに関するオープン ソース .NET プロジェクトの優れたプラクティスはありますか?

4

16 に答える 16

28

それは結果がどうであるかに完全に依存します。それらが互いに関連している場合、通常はカスタム クラスを作成します。

それらが実際に関連していない場合は、out パラメーターを使用するか、メソッドを分割します。メソッドが 3 つの無関係な項目を返したい場合は、おそらくやりすぎです。これに対する例外は、Web サービスの境界を越えて話している場合、または「より純粋な」API ではおしゃべりが多すぎる可能性がある場合です。

于 2008-12-03T17:15:17.263 に答える
10

2人分、通常は4人)

それ以上、2)

于 2008-12-03T17:12:30.950 に答える
5

あなたの質問は、将来さらに多くのデータを返す可能性を示しているため、独自のクラスを実装してデータを含めることをお勧めします。

これが意味することは、より多くのデータに対応するために渡すオブジェクトの内部表現が変更されても、メソッド シグネチャは同じままであるということです。また、読みやすさとカプセル化の理由からも良い方法です。

于 2008-12-03T17:37:29.403 に答える
2

個人的に、私はparamsを嫌い/参照するので、そのアプローチを使用したくありません。また、ほとんどの場合、複数の結果を返す必要がある場合は、おそらく何か間違ったことをしています。

それが本当に避けられないのであれば、あなたはおそらく長期的にはカスタムクラスを書くのが最も幸せでしょう。配列を返すことは、短い期間で簡単かつ効果的であるため魅力的ですが、クラスを使用すると、下流で問題を引き起こすことをあまり心配することなく、将来的に戻り型を変更するオプションが提供されます。誰かが返された配列内の2つの要素の順序を入れ替えた場合、デバッグの悪夢の可能性を想像してみてください。

于 2008-12-03T18:20:29.737 に答える
2

コード アーキテクチャに関しては、特定の量の変数を変更する必要がある場合は、常にカスタム クラスを使用します。なんで?クラスは実際には頻繁に使用されるデータ型の「設計図」であるため、独自のデータ型 (この場合はそれ) を作成すると、適切な構造を取得し、他のユーザーがインターフェイス用にプログラミングするのに役立ちます。

于 2008-12-03T17:19:12.373 に答える
1

場合によります。内部専用 API の場合、通常は最も簡単なオプションを選択します。一般的にはアウトです。

パブリック API の場合、通常はカスタム クラスの方が理にかなっていますが、それがかなりプリミティブなものである場合、または関数の自然な結果がブール値 (*.TryParse など) である場合は、out パラメータを使用します。bool への暗黙のキャストを使用してカスタム クラスを作成することもできますが、通常は奇妙です。

あなたの特定の状況では、単純な不変の DateRange クラスが私に最も適しているようです。既存のユーザーを邪魔することなく、その新しい価値を簡単に追加できます。

于 2008-12-03T17:16:36.997 に答える
1

あなたのシナリオでは、ジェネリック Range{T} クラスを定義することができます (範囲の有効性をチェックします)。

メソッドがプライベートの場合、通常はヘルパー ライブラリのタプルを使用します。一般に、パブリック メソッドまたはプロテクト メソッドは、常に分離する必要があります。

于 2008-12-20T12:18:34.947 に答える
1

カスタム型を返しますが、クラスを使用せず、構造体を使用します。メモリ割り当て/ガベージ コレクションのオーバーヘッドがないということは、マイナス面がないことを意味します。

于 2008-12-20T12:23:30.367 に答える
1

2 つの値を使用KeyValuePairする人もいます。Keyただし、2つのものにとのラベルを付けるだけなので、あまり良くありませんValue。あまり説明的ではありません。また、これを追加すると、非常にメリットがあります。

public static class KeyValuePair
{
    public static KeyValuePair<K, V> Make(K k, V v) 
    { 
        return new KeyValuePair<K, V>(k, v); 
    }
}

タイプを作成するときにタイプを指定する必要がなくなります。ジェネリック メソッドは型を推論できますが、ジェネリック クラス コンストラクターはできません。

于 2008-12-03T20:05:07.437 に答える
1

追加の変数が 1 つまたは 2 つだけの場合は out を使用します (たとえば、関数は実際の重要な結果である bool を返しますが、ログの目的で、関数が実行された時間を返す out パラメーターとしても long を返します)。

より複雑なものについては、通常、カスタム構造体/クラスを作成します。

于 2008-12-03T17:13:32.837 に答える
1

C# プログラマーがこれを行う最も一般的な方法は、返したいアイテムを別のクラスにラップすることだと思います。これにより、今後の柔軟性が最も高まります。

于 2008-12-03T17:14:46.547 に答える
1

更新の開始時刻と終了時刻を送り返したい場合は、おそらく DataRefreshResults と呼ばれるクラスまたは構造体が提案されます。考えられる 3 番目の値も更新に関連している場合は、追加できます。構造体は常に値渡しされるため、ヒープに割り当てられているため、ガベージ コレクションを行う必要がないことに注意してください。

于 2008-12-03T17:37:30.637 に答える
0

別の解決策は、名前付きオブジェクト参照の辞書を返すことです。私にとって、これはカスタムの戻り値クラスを使用するのとほぼ同じですが、混乱はありません。(また、RTTI とリフレクションを使用すると、動的ではありますが、他のソリューションと同じように型安全です。)

于 2008-12-03T18:39:47.047 に答える
0

結果のタイプと意味、およびメソッドがプライベートかどうかによって異なります。

プライベート メソッドの場合、通常はクラス ライブラリのタプルを使用します。

public/protected/internal メソッド (つまり、private ではない) の場合、out パラメータまたはカスタム クラスを使用します。

たとえば、失敗時に例外をスローする XYZ メソッドとブール値を返す TryXYZ メソッドがある TryXYZ パターンを実装している場合、TryXYZ は out パラメーターを使用します。

結果がシーケンス指向の場合 (つまり、処理する必要がある 3 人の顧客を返す)、通常は何らかのコレクションを返します。

それ以外は、通常はカスタム クラスを使用します。

于 2008-12-20T12:30:46.217 に答える
0

メソッドが 2 つから 3 つの関連する値を出力する場合、それらをタイプにグループ化します。値に関連性がない場合は、メソッドがやりすぎている可能性が高いため、いくつかのより単純なメソッドにリファクタリングします。

于 2008-12-20T12:39:05.967 に答える
0

2 の場合、ペア。

2名以上なら1クラス。

于 2008-12-03T17:28:12.323 に答える