你能长久开关/ enum声明中使用的区域?(Would you use regions within

2019-09-17 02:51发布

我最近发现自己需要(是的,需要)来定义荒谬长switch语句和enum在C#代码中的声明,但我想知道是什么人的感觉是他们分成逻辑子的最佳途径。 在我的情况,无论是枚举值和案件(这是基于枚举值)有相当明确的集团,但我稍微不确定如何在代码中反映这一点。

需要注意的是在我的代码,我有大约5组枚举10和30之间的数值/每情况。

我可以预见这三个隐约明智的选择是:

  1. 限定#region声明内围绕箱子/枚举值的所有逻辑组块(任选被空行隔开)。
  2. 注释每组它的名字,每个组名之前评论一个空行。
  3. 什么都不做任何 - 只需将开关/枚举作为一个巨大的情况下/值的列表。

你喜欢哪个? 你把枚举和开关分开? (这似乎有点奇怪我。)现在,我不敢说有什么正确/错误的回答这个问题,但我总归要在听了一般性意见consenus是很感兴趣。

注1:此情况下,我可能潜在有50/100 +值极长的枚举声明是不幸的是不可避免的(类似与开关),因为我试图写一个词法分析器(tokeniser),因此,这似乎在有几个原因最合理的做法。

注2:本人完全清楚,一些重复的问题已经存在关于是否在通用代码(用于结构类为主)使用区域的问题,但我觉得在这里我的问题是更具体的和尚未解决。

Answer 1:

当然,地区的事物了。 他们可能不会发生大的变化,而在这个时候,可以扩大该地区,进行更改,折叠它,并移动到文件的其余部分。

他们是有原因的,用它们来你的优势。



Answer 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);
    }
}


Answer 3:

我会离开它作为一个巨大的情况下/值的列表。



Answer 4:

如果有一些情况下,具有相同的代码块,使用Strategy设计模式,可以消除开关块。 这可以创造很多的课给你,但会显示它确实是多么复杂和小班分开的逻辑。



Answer 5:

摆脱枚举,使他们成为对象。 然后,您可以打电话给你的对象的方法,并让代码分离,易于维护,而不是一场噩梦。

还有,当你真正需要使用一个枚举,而不是一个对象的,没有人喜欢长switch语句极少数情况下。



Answer 6:

下面是谁使用地区的人们一个很好的捷径。

我的Eclipse和Visual Studio之间切换时,我试图通过按可进入全屏模式在VS

Ctrl-M-M

你瞧,区域封闭和扩大!



文章来源: Would you use regions within long switch/enum declarations?