切换案例而不是if else

时间:2016-02-07 13:55:03

标签: c# if-statement switch-statement

如何将此代码切换为switch情况?

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_HOTKEY && (int)m.WParam == 1)
        Console.WriteLine("w");
    else if (m.Msg == WM_HOTKEY && (int)m.WParam == 2)
        Console.WriteLine("a");
    else if (m.Msg == WM_HOTKEY && (int)m.WParam == 3)
        Console.WriteLine("s");
    else if (m.Msg == WM_HOTKEY && (int)m.WParam == 4)
        Console.WriteLine("d");

    base.WndProc(ref m);
}

这是我的最后一次尝试,第一个案例的行再次标记为红色

switch (m.Msg)
{
    case m.Msg == WM_HOTKEY && (int)m.WParam == 1:
       Console.WriteLine("w");
       break;
    case m.Msg == WM_HOTKEY && (int)m.WParam == 2:
       Console.WriteLine("a");
       break;
    case m.Msg == WM_HOTKEY && (int)m.WParam == 3:
       Console.WriteLine("s");
       break;
    case m.Msg == WM_HOTKEY && (int)m.WParam == 4:
       Console.WriteLine("d");
       break;
}

这可能吗?我认为在switch语句中阅读会更好看。

5 个答案:

答案 0 :(得分:4)

由于Msg的值始终相同(在您的条件下),您可以尝试这样做:

if(m.Msg == WM_HOTKEY)
{
    switch ((int)m.WParam)
    {
        case 1:
            Console.WriteLine("w");
            break;
        case 2:
            Console.WriteLine("a");
            break;
        case 3:
            Console.WriteLine("s");
            break;
        case 4:
            Console.WriteLine("d");
            break;
    }
}

重要的是要实现以下(取自MSDN)关于switch声明:

  

每个案例标签指定一个常量值。切换声明   将控制权转移到案例标签与之匹配的交换机部分   switch表达式的值(示例中为caseSwitch)。如果没有案例   label包含匹配值,控件转移到默认值   部分,如果有一个。如果没有默认部分,则不执行任何操作   采取和控制转移到switch语句之外。

答案 1 :(得分:4)

您无法打开条件。您只能打开常量值。

if (m.Msg == WM_HOTKEY)
{
    switch ((int)m.WParam)
    {
        case 1:
            Console.WriteLine("w");
            break;
        case 2:
            Console.WriteLine("a");
            break;
        case 3:
            Console.WriteLine("s");
            break;
        case 4:
            Console.WriteLine("d");
            break;
    }
}

答案 2 :(得分:1)

不,你不能在交换机情况下使用逻辑运算符。它只运行一个值

答案 3 :(得分:0)

你唯一能做的就是:

if(m.Msg == WM_HOTKEY)
{
    var param = (int)m.WParam;
    switch(param)
    {
        case 1:
            Console.WriteLine("w");
            break;
            ....
    }
}

答案 4 :(得分:0)

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_HOTKEY)
    {
        var param = (int)m.WParam;
        switch (param)
        {
            case 1:
                Console.WriteLine("w");
                break;
            case 2:
                Console.WriteLine("a");
                break;
            case 3:
                Console.WriteLine("s");
                break;
            case 4:
                Console.WriteLine("d");
                break;
            default:
                Console.WriteLine("Unrecognised key stroke.");
        }
        base.WndProc(ref m);
    }
    // todo:  What if m.Msg is no WM_HOTKEY?
}