0

次の if ステートメントを switch/case に変換するにはどうすればよいですか

private void Click(object sender, EventArgs e)
{
   if (Object.ReferenceEquals(sender, c0)) { spotClick(0); }
   if (Object.ReferenceEquals(sender, c1)) { spotClick(1); }
   if (Object.ReferenceEquals(sender, c2)) { spotClick(2); }
   if (Object.ReferenceEquals(sender, c3)) { spotClick(3); }
}
4

3 に答える 3

1

変数を値にマップしてから、値を呼び出すのはどうですか? そのようです:

Dictionary map = new Dictionary();
map.add(c0, 0);
map.add(c1, 1);
map.add(c2, 2);
map.add(c3, 3);

spotClick(map[sender]);
于 2013-03-24T22:35:23.403 に答える
1

コードを詳しく調べると、2 つのオブジェクトの参照を比較していることがわかります。あるオブジェクトの参照は他のオブジェクトの参照と同じにすることはできないため、このコードではif-else if組み合わせて使用​​できるため、次のようになります。

private void Click(object sender, EventArgs e)
{
   if (Object.ReferenceEquals(sender, c0)) { spotClick(0); }
   else if (Object.ReferenceEquals(sender, c1)) { spotClick(1); }
   else if (Object.ReferenceEquals(sender, c2)) { spotClick(2); }
   else if (Object.ReferenceEquals(sender, c3)) { spotClick(3); }
}

ReferenceEqualsメソッドは、両方のオブジェクトが null の場合にも true を返します (ここsenderを確認してください)。これにより、複数の比較が true である(複数の sporClick 呼び出しが実行された) 可能性がありnullますClick。あなたが投稿したものに。switchc0、c1、c2、および c3 が定数式の場合、 このようなコードは us​​e ステートメントに変換できますが、ご覧のとおり、これらはControlクラスから派生した型のオブジェクトを参照する変数であり、 case(チェックここで)。したがって、このコードを次のように変換することはできませんswitch/case

于 2013-03-24T22:56:40.393 に答える
-2

スイッチへの変換は、「if」ごとに異なる値であるため、最適化された方法ではありません。ただし、for ループを実行することはできます。

for(var i = 0; i < 4; i++){
   if (Object.ReferenceEquals(sender, "c" + i)) { spotClick(i); }
}

C#で「c」+ iを連結すると、次のようになります

string.Format("c{0}",i);

于 2013-03-24T22:36:22.467 に答える