switch语句中的变量初始化问题

Chu*_*ris 6 .net c# language-agnostic switch-statement

我所拥有的是简单的switch语句

Control myControl;
switch(x)
{
     case TabType.Edit:
     {
         myControl= ...;
     }

     case TabType.View:
     {

         myControl= ...;
     }
 }

 myPageView.Controls.Add(myControl);
Run Code Online (Sandbox Code Playgroud)

在这种情况下编译器告诉我

在访问之前,可能无法初始化局部变量myControl

那么,避免这种情况的最佳方法是什么?

一种选择是在switch语句之前初始化myControl.但在这种情况下,我再做一次不必要的初始化.

情况1:

Control myControl = null;
switch(x)
{
     case TabType.Edit:
     {
         myControl= ...;
     }

     case TabType.View:
     {

         myControl= ...;
     }
 }

 myPageView.Controls.Add(myControl);
Run Code Online (Sandbox Code Playgroud)

下一个选项是改变第二种情况default.之后编译器将"理解"myControl无论如何都将被初始化并且不会抛出异常.

案例2:

Control myControl;
switch(x)
{
     case TabType.Edit:
     {
         myControl= ...;
     }

     default:
     {

         myControl= ...;
     }
 }

 myPageView.Controls.Add(myControl);
Run Code Online (Sandbox Code Playgroud)

但是,这种情况看起来并不那么好,是因为增加了一些新特性,以我的枚举后它将为所有其他类型的默认参数进行(开发者可以很容易忘记改变这里的代码,也可以是没有必要的初始化myControl其他枚举类型) .

在这种情况下,最好的方法是什么?

Mat*_*ard 6

您的代码示例表明您将始终myControl在切换块后使用该变量.如果是这种情况,那么您应该预先初始化变量,或者添加一个default子句(如您所述).

如果您担心可能会引入新的枚举值,那么您可以在default子句中抛出一个有意义的异常.NullReferenceException当您稍后尝试取消引用变量时,这将保护您不会变得更加模糊.

  • 当命中`default` case时抛出异常+1.也是一个不错的选择. (3认同)
  • 谢谢大家:)带有有意义的异常的默认子句是一种不错的方法。 (2认同)