5

私の現在のコードは

object[] method()
{
returning new object[] {"",12,} like this ?
}

代わりにTupleの方が良いオプションですか?

ここでタプルのパフォーマンスに関する情報を入手しました

良い引っ越し方法を教えてください..

このクラスは使用頻度が高く、リクエストも多くなります。

アップデート

戻り値はメソッドごとに異なります。私はすべてのメソッドが2から10までの値を最大として返すようにしています。

ロジックは、sp [MS SQLストアドプロシージャ]ロジックを同等のmongoDbに変換しています(すべてのデータが存在します)

そのため、sp には、sp が返すように返されるメソッドが 1 つあります。その OUT パラメータの sp では、いくつかの整数値も返されます。

それを交換する際に使用している

object[] method(out int returnValue)
 {
 }

returnValue はエラー コード用で、object[] は sp の out パラメータの戻り値の型です。

これを行う最善の方法は何ですか?

4

7 に答える 7

12

3 番目のオプションもあります。単純な型指定された結果クラスまたはプロパティを持つ構造体です。返すアイテムが 3 つ以下の場合、Tuple は問題ありません。

C# でオブジェクト配列を返すことは悪い習慣です。できるだけ型付けするようにしてください。一般的な経験則として、コンピューターではなく、仲間の開発者のためにコードを作成します (その人が簡単に使用/変更できるようにするため)。フレームワークによって最適化が行われるようにします。

于 2013-10-25T07:07:31.240 に答える
4

Tuple<string,string>と の間でパフォーマンスがどのように異なるかに興味がある人向け

class MyClass 
{
    public string Field1 { get; set; }
    public string Field2 { get; set; }
}

DotNetPearlsの変更されたテストで測定した結果は次のとおりです。

アイテム数 = 1 000 000

8.27 ns -- タプルの割り当て
7.28 ns -- オブジェクトの割り当て

2.46 ns -- タプルを引数として
渡す 2.28 ns -- オブジェクトを引数として渡す

2.16 ns -- タプルを返す
2.31 ns -- オブジェクトを返す

3.12 ns -- リストからタプルをロードする
3.12 ns -- リストからオブジェクトをロードする

したがって、少なくともTupleそのような場合に使用するパフォーマンス上の理由はありません

于 2013-10-25T08:03:38.463 に答える
4

class代わりに、新しいインスタンスを作成してそのインスタンスを返すだけです。Item1,の代わりに適切なプロパティ名を使用することで、タイプ セーフと可読性が得られますItem2

配列の return の代わりに- そうすれば、コンシューマーを壊すことなくIEnumerable<>メソッドの実装を (例えば を導入することで) 変更できます。yield return

そして、それを覚えておいてください

時期尚早の最適化は諸悪の根源

于 2013-10-25T07:08:02.237 に答える
1

これを行うには多くの方法がありますが、タプルを返すことはその 1 つです。IDictionary は別のものですが、非常によく似ています。

複数のオブジェクトを返したいがコントロールを維持したい場合の別の方法は、メソッドで out パラメータを使用してこれらを指定することです。小さなサンプルを次に示します。

public bool method(out object result, out int intResult){
        result = new object[]{};
        intResult = 42;
        return true;
    }

私の意見では、コンテナー クラスを使用するのが最善の方法です。これにより、何が返され、データが何を表しているかをコードで明確に把握できます。

于 2013-10-25T07:07:24.323 に答える
0

メソッドの呼び出し元は受信したデータのサイズと型を知っているため、タプルの方が優れています。

// is better
var result = method().Value2 + 123;
// then
var received = method();
var result = 0;
if(received != null && received.Length > 1 && received[1] is int) // not sure, maybe received[1].GetType() == typeof(int)
    result = (int)received[1] + 123;

ただし、戻り値のカスタム クラスを提供するのが最善です。

class ReturnValue
{
    public string Text;
    public int Value;
    public ReturnValue(string text, int value)
    {
        Text = text;
        Value = value;
    }
}

ReturnValue method()
{
    // ...
    return new ReturnValue("", 12);
}
于 2013-10-25T07:13:31.283 に答える