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

上一篇: Variable initialization issue in switch statement

下一篇: How does switch statement work?