c#切换问题
我是编程新手并遇到以下代码问题:
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(); }
编译器说:使用未分配的局部变量’alphaChar’
但是我在交换机块中分配了它。
我确定这是我的错,因为我对编程知之甚少。
请指教。
谢谢。
如果 x为0-9, 则指定它。 如果x
为123,你会期望它做什么? 虽然您可能知道只传入0到9之间的值,但编译器却没有 – 所以它需要考虑否则会发生什么。
避免这种情况的一种方法是在switch语句中有一个default
大小写,如果该值不在预期范围内,您可以使用它来抛出exception:
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(); }
这里有一个稍微简单的替代方法,它会完全删除你的switch语句:
if (x < 0 || x > 9) { throw new ArgumentOutOfRangeException(); } char alphaChar = (char)('A' + x);
请注意,在使用这样的算术时,您需要小心谨慎。 在Java和C#中,底层表示保证是Unicode,这使生活变得更加容易。 我相信这对于这样的事情(以及hex解析/格式化)来说很好,但是当你冒险进入更奇特的场景时它会失败。 然后,对于许多代码简化技术来说都是如此……如果它们被不恰当地应用,你最终会陷入混乱。
编译器抱怨是因为alphaChar 可能未定义 – 如果它不是您的switch
某个值,那么它将不会被定义。 您可以执行以下操作之一:
- 设置char的初始值,如果没有任何切换条件为真,则将执行该初始值。
- 在switch语句中添加“default”子句。
在第一次使用之前,必须明确分配局部变量(根据C#规范规则)。 在这种特殊情况下,switch构造不保证alphaChar将被明确分配,因此编译器错误。 您可以为alphaChar提供初始值,因此它将被明确分配。
您需要在switch语句中添加默认值。
编译器声明在某些情况下不会为变量赋值。 所以加入
default: alphaChar = 'x' break;
将告诉编译器“所以,如果我错过了一些场景,请将值设为”
或者在不想分配默认值的情况下:
default: throw new Exception();
这不一定更好,但另一种方式:
private string alphaCoords(Int32 x) { if(x >= 0 && x =< 9) return ((char)(x + 65)).ToString(); else throw new ArgumentException(); }
您正在根据某些条件为变量alphaChar
赋值。 想象一下这样一个场景,其中变量x
包含0到9之外的值。假设它包含10.那么x
不会满足任何条件条件,因此alphaChar
不会被赋值任何值,因此它将完全未初始化。 因此,当您将alphaChar
转换为字符串时,它会将一些垃圾值转换为字符串并将其返回给调用方法。 这就是您收到该消息的原因。
如果您想获得一个简单的解决方案,请在下面添加以下代码
case 9: alphaChar = 'J'; break;
–
default: return null;
并检查调用方法这个alphaCoords
函数是否返回null,如下所示 –
if(alphaCooord(10) == null) { // x contains value other than 0 to 9 } else { // x contains value between 0 to 9, so the returned value will be the string // representation of the corresponding character }
这样你的代码就不会太复杂,或者你不需要抛出或处理任何exception或类似的东西。
希望有帮助:)。
编译器无法知道变量x
只能包含最多9个数字(这是您在switch
检查的数字)。 由于您的交换机缺少default
情况,因此alphaChar
可能会保持未分配状态。 您可以添加default
大小写,也可以在switch
之前为变量赋值。
为开关添加默认值,因为如果x为10,则永远不会分配alphaChar。
在声明变量char alphaChar之后,你应该为它“赋值”一个值(将它设置为等于某个值),即使你希望它在switch语句中得到一个值。
您可以将其指定为“A”或“0”或几乎任何东西。
你可以在这样的声明中做到这一点
char alphaChar = 'A';
或者你可以单独做
char alphaChar; alphaChar = 'A';