有没有一种方法可以重构C#特有的switch语句

本文关键字:重构 语句 switch 方法 一种 有没有 | 更新日期: 2023-09-27 18:27:40

我是C#(.NET 4.0)项目的新员工,但我来自C/C++背景。我被指示"全面改进我们的产品",并遇到了一个长达1000行的方法,该方法主要由一个包含15个案例的单个switch语句组成,每个案例大约有60行代码。

在这之前,我会保持相同的通用格式,但提取了15个函数,然后根据需要找出如何共享/指向局部变量/类数据成员。然而,我现在可以使用一系列神秘的新工具,我无法摆脱有一种"C#智能"方法可以实现这一点的感觉。

有没有一种方法可以在C#(4.0)中重构这个switch语句,而这在C++中是做不到的?

编辑:以下是经过净化和总结的代码形式:

private void DeviceRequest(List<OpRequest> currentOp, double adjTime) {
     //local variables
    while (/*condition*/)
    {
        //Some setup
        //Some initialization
        try
        {
            switch (OperationType)
            {
                case Setup:
                    //Message header setup through 'if-else' statements
                    //Message sending
                    //Many nested 'if' checks, a few less 'else's
                    break;
                case Initiate:
                    //Message header setup through 'if-else' statements
                    //Message sending
                    //Many nested 'if' checks, a few less 'else's
                    break;
                case Acquire:
                    //Message header setup through 'if-else' statements
                    //Message sending
                    //Many nested 'if' checks, a few less 'else's
                    break;
                case Measure:
                    //Message header setup through 'if-else' statements
                    //Message sending
                    //Many nested 'if' checks, a few less 'else's
                    break;
                case Reset:
                    //Message header setup through 'if-else' statements
                    //Message sending
                    //Many nested 'if' checks, a few less 'else's
                    break;
                //12 more cases, all fairly similar.
            }
        }
        catch (RunTimeError err)
        {
            //A few lines of code
        }
        finally
        {
          //Objective measure of time passage
        }
    }
}

有没有一种方法可以重构C#特有的switch语句

enum上的switch通常可以被操作的Dictionary取代。为了做好准备,每个行动都必须处理相同的输入。

如果可以将代码重构为具有相同签名的15个方法的集合,则可以将它们放入Dictionary<OpRequest,DelegateType>中,其中DelegateType是具有方法签名的委托。

例如,如果15种方法中的每一种都有低于的签名

private void SetupAction(double adjTime) {
    ...
}
void InitiateAction(double adjTime) {
    ...
}

你可以建立一个行动字典

private readonly IDictionary<OpRequest,Action<double>> OpActions = new Dictionary<OpRequest,Action<double>> {
    {OperationType.Setup, SetupAction}
,   {OperationType.Initiate, InitiateAction}
,   ... // and so on
};

有了这个字典,你可以重写你的循环如下:

while (/*condition*/) {
    //Some setup
    //Some initialization
    try {
        Action<double> action;
        if (OpActions.TryGetValue(opType, out action)) {
            action(adjTime);
        } else {
            ... // Report an error: unknown OpRequest
        }
    } catch (RunTimeError err) {
        ... //A few lines of code
    }
    finally {
        ... //Objective measure of time passage
    }
}