为啥 case 语句不允许我设置将在方法中使用的变量

Posted

技术标签:

【中文标题】为啥 case 语句不允许我设置将在方法中使用的变量【英文标题】:Why does a case statement NOT allow me to set variables that will be used inside a method为什么 case 语句不允许我设置将在方法中使用的变量 【发布时间】:2013-09-19 15:43:53 【问题描述】:

我正在尝试使用 case 语句为名为“query”的变量赋值。根据组合框的值,查询的值会发生变化。我在我的方法中分配了“查询”变量,并且只想在方法中使用它。我收到一条错误消息,指出“查询”变量未分配,即使它是在方法顶部分配的。我有一个解决方法,但我不知道为什么会这样?任何见解都会有所帮助。

这是代码。

public void ExportKml()
    
        string query;

            switch (txtTable.SelectedIndex)
            
                case 0:
                    query = "Select * from dbo.HyacinthWaterBodyZones";
                    break;
                case 1:
                    query="Select * from lchcd.privateWatersFinal where waterbodypolygon is not null";
                    break;
                case 2:
                    query = "Select * from lchcd.publicWatersFinal where waterbodypolygon is not null";
                    break;

            

            cs.Open();
            SqlCommand cmd = new SqlCommand(query, cs);   <<--Error Message 
            SqlDataReader polygon = cmd.ExecuteReader();

行内的“查询”变量: SqlCommand cmd = new SqlComman(query,cs) 给出一个错误,说明它是未分配的局部变量。

【问题讨论】:

虽然您选择的索引可能永远逻辑上是 0、1 或 2 以外的任何值,但编译器无法知道这一点。您需要使用虚拟值初始化变量,或者添加一个 case else 将其设置为虚拟值。 【参考方案1】:

您需要为query 分配一个初始值。 ""string.Empty。您还应该在您的开关中包含一个default 案例。见下文:

public void ExportKml()

    string query = string.Empty;

    switch (txtTable.SelectedIndex)
    
        case 0:
            query = "Select * from dbo.HyacinthWaterBodyZones";
            break;
        case 1:
            query = "Select * from lchcd.privateWatersFinal where waterbodypolygon is not null";
            break;
        case 2:
            query = "Select * from lchcd.publicWatersFinal where waterbodypolygon is not null";
            break;
        default:
            query = "";
            break;
    

    // Add a check for empty string before trying the query.
    if(!string.IsNullOrWhiteSpace(query))
    
        cs.Open();
        SqlCommand cmd = new SqlCommand(query, cs);
        SqlDataReader polygon = cmd.ExecuteReader();
    

【讨论】:

不需要default 的情况,为什么他还是应该包含它? 不需要默认大小写,但了解一下会很有帮助。很容易解决,但让我头疼 @CodeSlinger,阅读***.com/questions/4649423/… @sam Leach,在我的情况下不需要默认值,因为除非用户在组合框中选择一个项目,否则该方法不会运行。因此,case 语句总是返回一个从 0 到 2 的值。有用的链接虽然谢谢! 确保你编写了一些测试来证明你的假设。 :)【参考方案2】:

由于编译器无法知道您的SelectedIndex 是否始终为0、1 或2,因此强烈建议您初始化在切换之前定义但在切换之后使用的变量

string query = string.Empty;
switch(.....)

    ....

if(query.Length > 0)

    cs.Open();
    SqlCommand cmd = new SqlCommand(query, cs);   <<--Error Message 
    SqlDataReader polygon = cmd.ExecuteReader();    

在 switch 语句中添加默认情况也可以,但就我个人而言,我更喜欢在输入 switch 语句之前初始化查询变量。这对我来说更清楚,更不容易忘记一些其他重要的初始化

【讨论】:

也许使用string.IsNullOrWhiteSpace(query) ? @SamLeach 我不确定,在这种情况下它似乎毫无意义,因为我已经知道字符串不为空并且调用方法似乎更昂贵,而属性应该更快。然而,这些只是微优化。【参考方案3】:

如果所选索引不是 0-2,则不会命中任何 case 语句。如果要在 switch 中分配变量,则需要包含 default: 大小写。

switch (txtTable.SelectedIndex)

    case 0:
        query = "Select * from dbo.HyacinthWaterBodyZones";
        break;
    case 1:
        query="Select * from lchcd.privateWatersFinal where waterbodypolygon is not null";
        break;
    case 2:
        query = "Select * from lchcd.publicWatersFinal where waterbodypolygon is not null";
        break;
    default:
        //assign query = something here
        break;

【讨论】:

以上是关于为啥 case 语句不允许我设置将在方法中使用的变量的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能在计算列的 case 语句中使用子查询

switch结构case语句后的多个语句必须放在花括号中。 这句话对吗?为啥?

Java中为啥我写switch语句,在case后加break就错误,不加就正确,很困惑,

如何使用 SQL 中的 Case 语句将数据插入临时表

这个PHP流程判断switch语句哪里出错了?为啥不执行default后面的语句

这两个case when end的条件语句查询结果为啥不一致