为啥 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 语句不允许我设置将在方法中使用的变量的主要内容,如果未能解决你的问题,请参考以下文章
switch结构case语句后的多个语句必须放在花括号中。 这句话对吗?为啥?
Java中为啥我写switch语句,在case后加break就错误,不加就正确,很困惑,