2016-07-26 5 views
-1

私は、このクラスの構造を変更することはできないんだけど、次のメンバ変数C#でメンバー変数の選択肢を保存するにはどうすればよいですか?

class SomeClass 
{ 
    int idx0_value; 
    int idx1_value; 
    int idx2_value; 

    //... 
} 

でクラスを使用しています。

私は以前に選択されたインデックスに対してチェックするために、このクラスのインスタンスを使用して、いくつかif-elseステートメントを使用して変数に対応する値を代入しています:

if(indexIFoundEarlier == 0) 
    valueIWant = aSomeClass.idx0_value; 
else if(indexIFoundEarlier == 1) 
    valueIWant = aSomeClass.idx1_value; 
else 
    valueIWant = aSomeClass.idx2_value; 

これはかなり非効率です。

C++では、関係するメンバーへの参照を効果的に保存することができましたが、C#ではこれはできません。これについてはさまざまなスレッドを読んでいます。

"SomeClass"の構造を変更せずに、私が行った選択をより良い(より効率的に)読む方法がありますか?

+0

デコレータのデザインパターンを見てみましょう。 –

+0

効率があまり問題にならない場合は、常にリフレクションを使用できます。 – Jashaszun

+0

実行時にオブジェクトメンバーをプログラムで選択してアクセスすることについては、Stack Overflowに関する多くの質問があります。あなたの具体的な例では、リフレクションを使用するかアクセサーの代理人辞書を作成するのが適切かもしれませんが、そのような漠然とした言葉で質問することは不可能です。あなたのシナリオをはっきりと示す良い[mcve]を提供してください。あなたがすでに研究している具体的なテクニックと、これらのテクニックの1つ以上を実装する際に特に問題があったものについて説明してください。 –

答えて

0

あなたは...

class SomeClass { 

    int idx0_value; 
    int idx1_value; 
    int idx2_value; 

    private Func<int> selection; 

    private void SetSelection(int choice) { 
     switch(choice) { 
     case 0: 
     selection =() => idx0_value; 
     break; 
     case 1: 
     selection =() => idx1_value; 
     break; 
     case 2: 
     selection =() => idx2_value; 
     break; 
     } 
    } 

    private int GetSelectionAgain() { 
     return selection?.Invoke() ?? -1; 
    } 
} 
0

をデリゲートを使用することができますしかし、これはかなり非効率です。 C++では効果的に を関連メンバへの参照を格納することができましたが、C#ではこれが ではありません。これについてはさまざまなスレッドを読んでいます。

私の意見では、switch文を使用することは、このケースでは唯一の合理的な選択肢です。リフレクションや任意の種類の委任を使用するオーバーヘッドは、if-elseステートメントまたはswitchステートメントを実行するよりも高くなります。

//same concept as what you posted but as a switch statement 
switch(indexIFoundEarlier) 
{ 
    case 0: 
    valueIWant = idx0_value; 
    break; 
    case 1: 
    valueIWant = idx1_value; 
    break; 
    default: 
    valueIWant = idx2_value; 
    break; 
} 
0

拡張子を使用します。それは効率的ですか?それは何かと比較するまで主観的です。しかし、それは可読であり、それは重要です。あなたのロジックが単純で、誰かがやってくると、それが複雑なやり方で行われていることが分かったら、まず何かを逃していなければならないと仮定して、何度かそれを読むつもりです。そして、何かシンプルなことをしていることが分かったとき、なぜ単純に行われなかったのか不思議に思うかもしれません。

コードをリファクタリングしているうちに、これは常に発生します。我々は何か複雑なもの(多分私たちが書いたものや忘れたもの)に出くわし、私たちがそれを理解するとき、私たちは自分自身に「それはすべてあるの?それを簡単なものに置き換えてください。

public static class SomeClassExtensions 
{ 
    public static int GetValueFromIndex(this SomeClass someClass, int index) 
    { 
     if(index == 0) return someClass.idx0_value; 
     if(index == 1) return someClass.idx1_value; 
     return someClass.idx2_value; 
    } 
} 

var value = aSomeClass.GetValueFromIndex(indexIFoundEarlier); 
関連する問題