2013-10-25 3 views
5

私の現在のコードはタプルまたはオブジェクト配列は、C#で複数の値のメソッドから返すのが最適ですか?

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

ではなく、より良いオプションをタプルですか?

私は移動するための良いオプションを提案してくださいタプル性能here

に関するいくつかの情報を得ました。..

このクラスは、頻繁に使用され、要求が頻繁になります。値を返す

UPDATE

は異なる方法で異なっています。 私はすべてのメソッドの戻り値を2から10までmaxとして持っています。

ロジックは、IM変換SPのMongoDB相当[MS SQLストアドプロシージャ]ロジック(すべてのデータが存在している)

したがってSPの一つの方法が、そのためのSP returns.In属などのパラメータであるOUTを返すべきです使用され、整数値も返されます。 iは

object[] method(out int returnValue) 
{ 
} 

のreturnValueを用いたMこと置換で

はエラーコードであり、SPのOUTパラメータの戻り型として[]オブジェクト。

これを行うにはどうすればよいですか?

+1

あなたはOOPを使用する場合は、必要に応じて使用して新しいクラスを作成するには、この場合のほうがよいのではないでしょうフィールド? – Fedor

+2

実際にはTupleは型安全性を提供するので良いですが、内部の項目は設定されていないので、一度作成すると変更できません(Tupleは一旦メモリに作成されると不変です)。しかし、もしあなたが2つの事を返すだけなら、私はKeyValuePairを使うことになるでしょう。それはずっとうまくいくでしょう。 –

答えて

8

3つ目のオプションもあります。簡単な型指定の結果クラスまたはプロパティ付きの構造体です。あなたが3つ以上のアイテムを返さない場合、タプルは大丈夫です。

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

+4

これは毎回です。ここでタプルを使用しようとしているのは、怠け者にしようとしているだけですが、読みやすくメンテナンス可能なコードにはなりません。 7ヶ月後、「.Item6」は読者に何を意味するのでしょうか?だからはい:これ。 –

+0

私は2つ以上の値を返す各メソッドの戻り値の構造体を作成できます。それは大丈夫でしょうか? – shanmugharaj

+0

@shanしかし、 'struct'は' class'とは異なる振る舞いをすることを忘れないでください。 – Fedor

0

あなたはあなたの正確なユースケースに応じて、様々なオプションがあります。

あなたは1つのオブジェクトのみを返すために新しいクラス(または構造体)を作成することができます。

あなたはhereを参照してくださいoutの詳細については

object object2 = new object(); 
object methodObject = method(out object2); 
public object method(out object2){ 
    object2 = ...; 
    object returnObject = new object(...); // do whatever you need 
    return object; 
} 

のようなものを使用することができます。 refも同様です。hereを参照してください。

あなたはすでにTupleと言いましたが、これもオプションです。個人的には、私はobject[]の戻り値の型から離れています。コードを理解して維持するのが難しくなります。

1

パフォーマンスが本質であり、あなたは単にあなたがまたoutパラメータになるはず、複数の値を返すために必要がある場合:おそらく

string method(out int secondResult) 
{ 
    secondResult = 12; 
    return ""; 
} 

として素敵ではない、しかし、あなたが作成する必要はありませんパフォーマンスに関連するコンテナオブジェクト

1

タプルを返す方法はたくさんありますが、返すタプルは1つです。 IDictionaryは別のものですが、非常に似ています。あなたが複数のオブジェクトを返し、まだ制御したい場合は

もう一つの方法は、方法 IN OUTパラメータでこれらを指定することであるここで小さなサンプルです:私の意見では

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

は最良の方法は、使用していますコンテナークラスを使用すると、返される内容とデータが表す内容をコードで明確に把握できます。

4

新しいclassを作成し、代わりにそのインスタンスを返します。 これは、Item1,Item2ではなく、適切なプロパティ名のために型の安全性と可読性を提供します。

アレイの代わりにIEnumerable<>を返すことで、コンシューマーを破損することなくメソッドの実装を変更することができます(たとえば、yield returnを導入することによって)。

とメソッドの呼び出し側は、受信したデータのサイズと種類を知っているだろうので

premature optimisation is the root of all evil

+0

downvoterは説明できますか? –

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; 

を戻り値のカスタムクラス:

パフォーマンスは Tuple<string,string>

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

の間でどのように異なるかに興味があるかもしれない人のため

2

私はDotNetPearlsから修正のテストでそれを測定してきたし、結果は次のとおりです。

ItemsCount = 1 000 000

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

2.46ナノ秒 - 引数として渡すタプル
2.28ナノ秒 - 戻りタプル
2.31ナノ秒 - - 戻りオブジェクト

3.12ナノ秒 - リストからタプルを読み込み、引数

2.16ナノ秒としてオブジェクトを渡します
3。12ナノ秒 - リストからロードオブジェクト

だから、何のパフォーマンス上の理由は、少なくともそのような場合にTupleを使用しないためにそこにある

関連する問題