switch语句中的变量初始化问题
我拥有的是简单的switch语句
Control myControl;
switch(x)
{
case TabType.Edit:
{
myControl= ...;
}
case TabType.View:
{
myControl= ...;
}
}
myPageView.Controls.Add(myControl);
在这种情况下,编译器告诉我
局部变量myControl在访问之前可能未被初始化
那么,避免这种情况的最好方法是什么?
一种选择是在switch语句之前初始化myControl。 但在这种情况下,我再做一次不必要的初始化。
情况1:
Control myControl = null;
switch(x)
{
case TabType.Edit:
{
myControl= ...;
}
case TabType.View:
{
myControl= ...;
}
}
myPageView.Controls.Add(myControl);
下一个选项是使用default
更改第二种情况。 之后,编译器将“理解”myControl将被初始化并且不会抛出异常。
情况2:
Control myControl;
switch(x)
{
case TabType.Edit:
{
myControl= ...;
}
default:
{
myControl= ...;
}
}
myPageView.Controls.Add(myControl);
但是这种情况看起来不太好,因为在为我的枚举添加一些新属性之后,它将为所有其他类型设置默认值(开发人员可以轻松忘记在此更改代码,或者不需要为其他枚举类型初始化myControl) 。
在这种情况下最好的办法是什么?
您的代码示例表明您将始终在切换块后使用myControl
变量。 如果是这种情况,那么你应该预先初始化变量,或者添加一个default
子句(如你所提到的)。
如果您担心可能会引入新的枚举值,则可以在default
子句中引发一个有意义的异常。 这会在以后尝试取消引用该变量时防止出现更多含糊的NullReferenceException
。
第三种选择:在继续之前创建一个实例(而不是依赖它被分配):
Control mycontrol = null;
switch (x){
// ...
}
if (myControl != null){
// add to controls list, manipulate, etc.
}
您还可以将default:
透视案例添加到default(TabType)
值中:
switch (x){
case TabType.Two:
// ...
case TabType.Three:
// ...
case TabType.One:
default:
// ..
}
我认为这种default
存在专门针对这些情况。
添加一些新的属性到我的枚举它会做所有其他类型的默认值
它将允许你的代码在默认前提下工作(抛出一个异常或设置一个非常知道的值),因此你的代码也适用于以前没有计划的情况。
当然,当你实现新的属性并期望代码有不同的行为时,省略更新这个开关将是一个容易发现的错误。
链接地址: http://www.djcxy.com/p/84311.html