2011-01-13 12 views
2

私は列挙型とint型の配列を返す必要がある何かに取り組んでいます。私は全体の問題を回り、列挙型の代わりにintを使用して配列の最初の要素として追加することができますが、列挙型はコードの読みやすさに本当に役立ちます。同じ時間に両方を返す方法はありますか?C#enumとint配列を返す

+1

答えは、合理的な選択肢を提供しますが、私は助けるが、ここで解決するために、より大きな設計上の問題があることを考えることはできません。メソッドが何をしているのか、整数の可変コレクションと列挙型を返すのかを記述できますか? –

答えて

11

これには3つの一般的な解決策があります。適切である1 は、特定の状況やあなたの個人的な好みに依存する:

  1. は、それらのいずれかのoutパラメータを使用します。これは新しいタイプを必要としませんが、電話には不便です。さらに、返された値間の関係を意味的に取り込むことはできません。

    public int[] MyMethod(out MyEnumType myEnum) 
    { 
        myEnum = ... 
        int[] nums = ...  
        return nums; 
    } 
    
  2. Tuple<,>タイプ(.NET 4.0)を使用してください。これは、既存のBCLタイプからのクローズドジェネリックタイプの構築だけを必要としますが、カプセル化されたプロパティに無意味な名前があるという事実は気に入らないかもしれません。KeyValuePair<,>タイプもあります。またはPair<,>タイプを書くこともできます。類似の目的。

    public Tuple<int[], MyEnumType> MyMethod() 
    { 
        int[] nums = ... 
        MyEnumType myEnum = ... 
        return Tuple.Create(nums, myEnum); 
    } 
    
  3. int配列とenumをカプセル化するラッパークラスを記述します。より多くの作業が可能ですが、発信者と一緒に作業するのが最適です。

    public class Wrapper 
    { 
        public int[] Nums { get { ... } } 
        public MyEnumType MyEnum { get { ... } } 
    } 
    ... 
    public Wrapper MyMethod() 
    { 
        Wrapper wrapper = ... 
        return wrapper; 
    } 
    
+0

私はラッパークラスを使うことを考えました。 C#がタプルを持っていることを知らなかったので、行く方法があると思います。タプルを使用してintに固執することにパフォーマンスに影響があるかどうかを知っていますか? – user472875

+3

@ user472875:2つが論理的に意味を持つ場合、ラッパークラスは実際に行く方法になります。 –

+0

@ user472875:ありません。それは本当に軽量です。興味があれば、逆コンパイラを使ってそのソースを見ることができます。その他のパフォーマンス上の問題と同様に、プロファイラを使用して問題が実際にラッパー(カスタムまたはタプル)の構築にあることを識別し、それぞれの代替案をプロファイルします。 – Ani