使用switch语句的最佳做法是什么?拼图?具体?

dor*_*ork 3 c# nested switch-statement

只是想知道如果两个代码块产生相同的结果,哪种方法会更好:


string  from = ddFrom.SelectedItem.ToString(),
            to = ddTo.SelectedItem.ToString();

switch(from)
{
    case "celsius":
        switch(to)
        {
            case "celsius":
                break;
            case "fahrenheit":
                break;
            case "kelvin":
                break;
        }
        break;

    case "fahrenheit":
        switch(to)
        {
            case "celsius":
                break;
            case "fahrenheit":
                break;
            case "kelvin":
                break;
        }
        break;

    case "kelvin":
        switch(to)
        {
            case "celsius":
                break;
            case "fahrenheit":
                break;
            case "kelvin":
                break;
        }
        break;
}

或者这个:


string  from = ddFrom.SelectedItem.ToString(),
            to = ddTo.SelectedItem.ToString(),
            conversion = from + to;

switch(conversion)
{
    case "celsiusfahrenheit":
        break;
    case "celsiuskelvin":
        break;
    case "fahrenheitcelsius":
        break;
    case "fahrenheitkelvin":
        break;
    case "kelvincelsius":
        break;
    case "kelvinfahrenheit":
        break;
}

谢谢.

Jon*_*Jon 11

第二种选择是可取的,因为正如每个人所说,它使代码看起来更好.

但是,您可能需要考虑更具架构的选项:

public class TemperatureConverter
{
    private static readonly IDictionary<Tuple<string, string>, Func<double, double>> ConverterMap =
        new Dictionary<Tuple<string, string>, Func<double, double>>
        {
            { Tuple.Create("celsius", "kelvin"), t => t + 273 },
            // add similar lines to convert from/to other measurements
        }

    public static double Convert(double degrees, string fromType, string toType)
    {
        fromType = fromType.ToLowerInvariant();
        toType = toType.ToLowerInvariant();
        if (fromType == toType) {
            return degrees; // no conversion necessary
        }

        return ConverterMap[Tuple.Create(fromType, toType)](degrees);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

TemperatureConverter.Convert(0, "celcius", "kelvin");
Run Code Online (Sandbox Code Playgroud)

当然这可以进一步改进(首先考虑使用枚举值而不是温度类型的字符串,还有一些错误检查是有序的),但总体思路是存在的.

恕我直言,这是旧学校C风格大型switch和完全成熟的OO 方法之间的良好中间路线方法(这里没有真正需要OO,因为这个特定的转换问题有一个非常简单的领域模型).