c#切换问题

iTE*_*Egg 8 c# switch-statement unassigned-variable

我是编程新手并遇到以下代码问题的新手:

    private string alphaCoords(Int32 x)
    {
        char alphaChar;

        switch (x)
        {
            case 0: alphaChar = 'A'; break;
            case 1: alphaChar = 'B'; break;
            case 2: alphaChar = 'C'; break;
            case 3: alphaChar = 'D'; break;
            case 4: alphaChar = 'E'; break;
            case 5: alphaChar = 'F'; break;
            case 6: alphaChar = 'G'; break;
            case 7: alphaChar = 'H'; break;
            case 8: alphaChar = 'I'; break;
            case 9: alphaChar = 'J'; break;
        }

        return alphaChar.ToString();
    }
Run Code Online (Sandbox Code Playgroud)

编译器说:使用未分配的局部变量'alphaChar'

但我正在我的交换机块中分配它.

我确定这是我的错,因为我对编程知之甚少.

请指教.

谢谢.

Jon*_*eet 35

如果 x为0-9 ,指定它.如果x是123,你会期望它做什么?虽然可能知道只传入0到9之间的值,但编译器没有 - 所以需要考虑否则会发生什么.

避免这种default情况的一种方法是在switch语句中有一个case,如果值不在预期范围内,你可以使用它来抛出异常:

switch (x)
{
    case 0: alphaChar = 'A'; break;
    case 1: alphaChar = 'B'; break;
    case 2: alphaChar = 'C'; break;
    case 3: alphaChar = 'D'; break;
    case 4: alphaChar = 'E'; break;
    case 5: alphaChar = 'F'; break;
    case 6: alphaChar = 'G'; break;
    case 7: alphaChar = 'H'; break;
    case 8: alphaChar = 'I'; break;
    case 9: alphaChar = 'J'; break;
    default: throw new ArgumentOutOfRangeException();
}
Run Code Online (Sandbox Code Playgroud)

这里有一个稍微简单的替代方法,它会完全删除你的switch语句:

if (x < 0 || x > 9)
{
    throw new ArgumentOutOfRangeException();
}
char alphaChar = (char)('A' + x);
Run Code Online (Sandbox Code Playgroud)

请注意,你需要使用算术这样的时候必须小心.在Java和C#中,底层表示保证是Unicode,这使生活变得更容易.我相信它对于这样的事情(以及十六进制解析/格式化)来说很好,但是当你冒险进入更奇特的场景时它会失败.然后,对于许多代码简化技术来说都是如此......如果它们被不恰当地应用,你最终会陷入混乱.

  • Downvoted for(char)('A'+ x).在Unicode世界中,使用算术来操纵字符值是一种非常糟糕的做法. (6认同)
  • @Cylon Cat:在一个不受限制的范围内,我同意 - 但是在这里我们已经确定了`x`的值范围,结果是明确定义的.这种"非常糟糕的做法"是以什么方式进行的?你认为这段代码会出什么问题?你能指出结果未定义或不正确的任何情况吗?*粗心*算法与字符数据之间的差别很大,而且*所有*这样的算法都是个坏主意. (5认同)
  • @Cylon Cat:但正如你所说,我们生活在"Unicode世界"中 - 所以你绝对可以依赖算术将会做什么(在C#和Java中).您可以依赖底层表示,因为它是明确指定的.关于口音的业务与**代码**无关,因为只需要考虑AJ.我会在答案中添加一个注释来发出关于尝试应用***的广泛警告,但对于这个特定情况,我对此没有任何疑虑. (4认同)
  • @Jon,"在限制范围内",是的,它有效.我关心的是建立不良习惯,并依赖于潜在代表的特征.但是,我想到了两个直接的案例.首先,这是一种仅限英语的技术; 带有重音符号,变音符号等的语言需要避免这种情况.其次,我在EBCDIC长大,即使是基本的英文字母也不在一个连续的范围内('A' - 'J'= xC0到xC9;'K' - 'T'= xD0到xD9;'UZ'= xE0到xE5).所以一般来说,我更信任指针运算而不是信任字符算术,而且我不信任指针运算. (3认同)