你会在long switch / enum声明中使用区域吗?

我最近发现自己需要(是的,需要)在C#代码中定义荒谬的长switch语句和enum声明,但我想知道人们认为将它们分成逻辑子部分的最佳方法。 在我的情况下,枚举值和案例(基于枚举值)都有相当清晰的分组,但我稍微不确定如何在代码中反映这一点。

请注意,在我的代码中,我有大约5组,每组10到30个枚举值/个案。

我能想到的三个含糊不清的选择是:

  1. 在声明中定义case / enum值的所有逻辑组周围的#region块(可选地用空行分隔)。
  2. 使用它的名称对每个组进行注释,并在每个组名注释前添加一个空行。
  3. 什么都不做 – 只需将开关/枚举作为一个巨大的案例/值列表。

你喜欢哪个? 你会分开处理枚举和开关吗? (这对我来说似乎有些奇怪。)现在,我不会说这个问题有任何正确/错误的答案,尽管我仍然非常有兴趣听取一般意见的一致意见。

注1:遗憾的是,我可能有一个非常长的枚举声明50/100 +值的情况是不可避免的(和开关一样),因为我试图写一个词法分析器(tokeniser),这看起来似乎是最合理的方法有几个原因。

注2:我完全清楚在是否在一般代码中使用区域(主要用于构造类)的问题上已经存在几个重复的问题,但我觉得我的问题更加具体,尚未得到解决。

当然,将这些事情区分开来。 它们可能不会发生太大变化,当它们发生变化时,您可以扩展区域,进行更改,折叠它,然后转移到文件的其余部分。

他们是有原因的,使用它们对你有利。

您还可以使用Dictionary <[your_enum_type],Action>(或Func而不是Action)或类似的东西(考虑到您的函数具有类似的签名)。 然后你可以而不是使用开关,而不是:

  switch (item) { case Enum1: func1(par1, par2) break; case Enum2: func2(par1, par2) break; } 

你可以有这样的东西:

 public class MyClass { Dictionary> 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> 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); } } 

我会把它作为一个巨大的案例/价值列表。

如果某些情况具有相同的代码块,则使用策略设计模式可以删除开关块。 这可以为您创建许多类,但会显示它的复杂程度,并将逻辑拆分为较小的类。

摆脱枚举并将它们变成对象。 然后,您可以调用对象上的方法,并保持代码分离,可维护,而不是噩梦。

在实际需要使用枚举而不是对象的情况下,很少有人喜欢使用long switch语句。

对于使用区域的人来说,这是一个很好的捷径。

当我试图通过按下全屏在VS中时,我在Eclipse和Visual Studio之间切换

 按Ctrl-MM 

而且,看到该地区关闭和扩大!