我最近发现自己需要(是的,需要)来定义荒谬长switch
语句和enum
在C#代码中的声明,但我想知道是什么人的感觉是他们分成逻辑子的最佳途径。 在我的情况,无论是枚举值和案件(这是基于枚举值)有相当明确的集团,但我稍微不确定如何在代码中反映这一点。
需要注意的是在我的代码,我有大约5组枚举10和30之间的数值/每情况。
我可以预见这三个隐约明智的选择是:
- 限定
#region
声明内围绕箱子/枚举值的所有逻辑组块(任选被空行隔开)。 - 注释每组它的名字,每个组名之前评论一个空行。
- 什么都不做任何 - 只需将开关/枚举作为一个巨大的情况下/值的列表。
你喜欢哪个? 你把枚举和开关分开? (这似乎有点奇怪我。)现在,我不敢说有什么正确/错误的回答这个问题,但我总归要在听了一般性意见consenus是很感兴趣。
注1:此情况下,我可能潜在有50/100 +值极长的枚举声明是不幸的是不可避免的(类似与开关),因为我试图写一个词法分析器(tokeniser),因此,这似乎在有几个原因最合理的做法。
注2:本人完全清楚,一些重复的问题已经存在关于是否在通用代码(用于结构类为主)使用区域的问题,但我觉得在这里我的问题是更具体的和尚未解决。
当然,地区的事物了。 他们可能不会发生大的变化,而在这个时候,可以扩大该地区,进行更改,折叠它,并移动到文件的其余部分。
他们是有原因的,用它们来你的优势。
你也可以有一个字典<[your_enum_type],动>(或行动,而不是Func键)或类似的东西(考虑您的功能有类似的签名)。 然后,你可以,而不是使用开关,而不是:
switch (item)
{
case Enum1: func1(par1, par2)
break;
case Enum2: func2(par1, par2)
break;
}
你可以有这样的:
public class MyClass
{
Dictionary<int, Action<int, int>> myDictionary;
//These could have only static methods also
Group1Object myObject1;
Group2Object myObject2;
public MyClass()
{
//Again, you wouldn't have to initialize if the functions in them were static
myObject1 = new Group1Object();
myObject2 = new Group2Object();
BuildMyDictionary();
}
private Dictionary<int, Action<int, int>> BuildMyDictionary()
{
InsertGroup1Functions();
InsertGroup2Functions();
//...
}
private void InsertGroup2Functions()
{
myDictionary.Add(1, group2.AnAction2);
myDictionary.Add(2, group2.AnotherAction2);
}
private void InsertGroup1Functions()
{
myDictionary.Add(3, group1.AnAction1);
myDictionary.Add(4, group1.AnotherAction1);
}
public void DoStuff()
{
int t = 3; //Get it from wherever
//instead of switch
myDictionary[t](arg1, arg2);
}
}
如果有一些情况下,具有相同的代码块,使用Strategy设计模式,可以消除开关块。 这可以创造很多的课给你,但会显示它确实是多么复杂和小班分开的逻辑。
摆脱枚举,使他们成为对象。 然后,您可以打电话给你的对象的方法,并让代码分离,易于维护,而不是一场噩梦。
还有,当你真正需要使用一个枚举,而不是一个对象的,没有人喜欢长switch语句极少数情况下。
下面是谁使用地区的人们一个很好的捷径。
我的Eclipse和Visual Studio之间切换时,我试图通过按可进入全屏模式在VS
Ctrl-M-M
你瞧,区域封闭和扩大!