比方这个
上述代码是用于两个历程之间通讯的代码,因为通讯的罗列迥殊的多,所以case的分支迥殊的多。致使了代码的可读性,可维护性严峻下落。经由查找材料和重构,想到了一种可行的在这类状况替换switch...case的计划——————应用键值对。
声明键值对对象
针对历程通讯的代码逻辑,构建了以下的键值对。
Dictionary<EnumMsg, Action<Message>> mMessageReceiver = new Dictionary<EnumMsg, Action<Message>>();
这个键值对的键是自定义的音讯罗列,值是Action<Message>
的托付。如许音讯罗列和音讯罗列对应的处置惩罚函数就一一对应了。
初始化时注册音讯
在初始化时,将罗列与响应的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语句的示例的细致内容,更多请关注ki4网别的相干文章!