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

时间:2009-06-26 18:52:17

标签: c# enums switch-statement regions

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

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

我可以设想的三个含糊不清的选择是:

  1. 在声明中的所有逻辑案例组/枚举值周围定义#region块(可选地用空行分隔)。
  2. 使用它的名称对每个组进行注释,并在每个组名注释前添加一个空行。
  3. 什么都不做 - 只需将switch / enum作为一个巨大的案例/值列表。
  4. 你更喜欢哪一个?你会分别对待枚举和开关吗?(这对我来说似乎有些奇怪。)现在,我不会说这个问题有任何正确/错误的答案,尽管我仍然对听证会很感兴趣一般意见的共识是什么。

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

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

6 个答案:

答案 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

并且看,该地区关闭并扩大了!