我最近发现自己需要(是的,需要)在C#代码中定义荒谬的长switch
语句和enum
声明,但我想知道人们认为最好的分割方法是什么他们成为逻辑小节。在我的情况下,枚举值和案例(基于枚举值)都有相当清晰的分组,但我稍微不确定如何在代码中反映这一点。
请注意,在我的代码中,我有大约5组,每组10到30个枚举值/个案。
我可以设想的三个含糊不清的选择是:
#region
块(可选地用空行分隔)。你更喜欢哪一个?你会分别对待枚举和开关吗?(这对我来说似乎有些奇怪。)现在,我不会说这个问题有任何正确/错误的答案,尽管我仍然对听证会很感兴趣一般意见的共识是什么。
注1:遗憾的是,我可能有一个非常长的枚举声明50/100 +值的情况是不可避免的(和开关一样),因为我试图写一个词法分析器(tokeniser),因此出于几个原因,这似乎是最合理的方法。
注2:我完全清楚在是否在一般代码中使用区域(主要用于构造类)的问题上已经存在几个重复的问题,但我觉得我的问题很多更具体,尚未得到解决。
答案 0 :(得分:3)
当然,将这些事情区分开来。它们可能不会发生太大变化,当它们发生变化时,您可以扩展区域,进行更改,折叠它,然后转移到文件的其余部分。
他们出于某种原因,将它们用于你的优势。
答案 1 :(得分:3)
你也可以有一个词典< [your_enum_type],动作> (或Func而不是Action)或类似的东西(考虑到你的函数有类似的签名)。然后你可以而不是使用开关,而不是:
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);
}
}
答案 2 :(得分:1)
我会把它留作一个巨大的案例/价值清单。
答案 3 :(得分:1)
如果某些情况具有相同的代码块,则使用策略设计模式可以删除开关块。这可以为你创建很多类,但会显示它实际上有多复杂,并将逻辑分成较小的类。
答案 4 :(得分:0)
摆脱枚举并将它们变成对象。然后,您可以调用对象上的方法,并保持代码分离,可维护,而不是噩梦。
在极少数情况下,您实际上需要使用枚举而不是对象,并且没有人喜欢长切换语句。
答案 5 :(得分:0)
对于使用区域的人来说,这是一个很好的捷径。
当我尝试通过按
在VS中全屏显示时,我在Eclipse和Visual Studio之间切换Ctrl-M-M
并且看,该地区关闭并扩大了!