首頁 >後端開發 >C#.Net教程 >C#如何使用鍵值對取代Switch...Case語句的範例

C#如何使用鍵值對取代Switch...Case語句的範例

黄舟
黄舟原創
2017-09-07 13:56:153478瀏覽

swich....case 條件分支多了之後,會嚴重的破壞程序的美觀。
例如這個
C#如何使用鍵值對取代Switch...Case語句的範例

上述程式碼是用於兩個行程之間通訊的程式碼,由於通訊的枚舉特別的多,所以case的分支特別的多。導致了程式碼的可讀性,可維護性嚴重下降。經過查找資料和重構,想到了一個可行的在這種情況取代switch...case的方案——————利用鍵值對。

聲明鍵值對物件

針對進程通訊的程式碼邏輯,建構瞭如下的鍵值對。

Dictionary<EnumMsg, Action<Message>> mMessageReceiver = new Dictionary<EnumMsg, Action<Message>>();

這個鍵值對的鍵是自訂的訊息枚舉,值是Action58613a913f649e803df57c76e6a932e4的委託。這樣訊息枚舉和訊息枚舉對應的處理函數就一一對應了。

初始化時註冊訊息

在初始化時,將列舉與對應的Action進行載入。

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);
}

這樣就把鍵值對物件建構完成。那就可以將重構swith...case程式碼段了。

修改switch...case程式碼片段

重構前的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分支,但是利用鍵值對的方法,只需要編寫新的處理方法,並且在鍵值對中增加新的一對鍵值就可以了。程式碼簡潔美觀,沒有一長串令人厭煩的case了。

以上是C#如何使用鍵值對取代Switch...Case語句的範例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn