swich....case 条件分岐が多すぎると、プログラムの美観が著しく損なわれます。
例えばこれ
上記のコードは2つのプロセス間の通信に使用されており、通信には多くの列挙が存在するため、多くの場合の分岐があります。その結果、コードの可読性と保守性が大幅に低下します。情報を検索して再構築した結果、この状況でケースを切り替えるための実行可能な代替手段、つまりキーと値のペアを使用する方法を思いつきました。
プロセス通信のコード ロジックでは、次のキーと値のペアが構築されます。
Dictionary<EnumMsg, Action<Message>> mMessageReceiver = new Dictionary<EnumMsg, Action<Message>>();
このキーと値のペアのキーはカスタム メッセージ列挙で、値は Action<Message>
のデリゲートです。このように、メッセージ列挙と、メッセージ列挙に対応する処理関数とは、1対1に対応することになる。
初期化中に、列挙と対応するアクションを読み込みます。
private void SubscribeMessageReceiver() { mMessageReceiver.Add(EnumMsg.SEND_PANO_PARAM, UpdatePano); mMessageReceiver.Add(EnumMsg.CMD_PANO_VIEW, ExecutePanoViewCommand); mMessageReceiver.Add(EnumMsg.CMD_PANO_LENGTH_MEASURE, ExecuteLengthMeasure); mMessageReceiver.Add(EnumMsg.CMD_PANO_AREA_MEASURE, ExecuteAreaMeasure); mMessageReceiver.Add(EnumMsg.CMD_PANO_QUICK_PICK, ExecuteQickPickCommand); }
これで、キーと値のペア オブジェクトの構築が完了しました。次に、switch...case コード セグメントをリファクタリングできます。
スイッチ…再構成前のケースコード
protected override void DefWndProc(ref Message m) { switch (m.Msg) { case ((int)API.WM_COPYDATA): { switch ((int)m.WParam) { case ((int)Procedure.OpenSkyline): m = OpenSkylineView(m); break; case ((int)Procedure.Measureare): m = Measure(m); break; case ((int)Procedure.Measurelength): m = Measure(m); break; } } break; default: break; } base.DefWndProc(ref m); }
キーと値のペアに基づいて、対応する処理メソッドのコードを検索
protected override void DefWndProc(ref Message m) { base.DefWndProc(ref m); if (m.Msg == (int)API.WM_COPYDATA) { EnumPanoMsg pEnumPanoMsg = (EnumPanoMsg)m.WParam; if (mMessageReceiver.Keys.Contains(pEnumPanoMsg)) { mMessageReceiver[pEnumPanoMsg](m); } } }
キーに基づいて検索キーと値のペア、新しい case ブランチを追加する必要がある場合、元のメソッドでは switch....case ブランチを変更する必要がありますが、キーと値のペアのメソッドを使用すると、新しい処理メソッドを記述するだけで済みます。キーと値のペアに新しいものを追加するだけです。コードは簡潔で美しく、退屈なケースの長いリストはありません。
以上がキーと値のペアを使用して Switch...Case ステートメントを置き換える方法の C# 例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。