0

如何将以下 if 语句转换为 switch/case

private void Click(object sender, EventArgs e)
{
   if (Object.ReferenceEquals(sender, c0)) { spotClick(0); }
   if (Object.ReferenceEquals(sender, c1)) { spotClick(1); }
   if (Object.ReferenceEquals(sender, c2)) { spotClick(2); }
   if (Object.ReferenceEquals(sender, c3)) { spotClick(3); }
}
4

3 回答 3

1

如果我们详细检查您的代码,我们会发现您正在比较两个对象的引用。由于一个对象的引用不能等于其他对象的引用,因此在此代码中似乎可以使用if-else if组合,因此它可能如下所示:

private void Click(object sender, EventArgs e)
{
   if (Object.ReferenceEquals(sender, c0)) { spotClick(0); }
   else if (Object.ReferenceEquals(sender, c1)) { spotClick(1); }
   else if (Object.ReferenceEquals(sender, c2)) { spotClick(2); }
   else if (Object.ReferenceEquals(sender, c3)) { spotClick(3); }
}

ReferenceEquals如果两个对象都为 null(请在此处查看),则该方法也返回 true,这可能会产生多重比较为 true(执行了多个 sporClick 调用),但在正常情况下,我们不能指望这sendernull因为Click事件触发了,因此这是一个合法的代码和等价的到您发布的一个。如果 c0、c1、c2 和 c3 是常量表达式,则此类代码可以转换为 useswitch语句,但正如我们所见,它们是引用从 Control类派生的类型的对象的变量,因此不能在内部使用case(检查在这里)。因此,您无法将此代码转换为switch/case

于 2013-03-24T22:56:40.393 回答
1

您如何将变量映射到值然后调用该值?像这样:

Dictionary map = new Dictionary();
map.add(c0, 0);
map.add(c1, 1);
map.add(c2, 2);
map.add(c3, 3);

spotClick(map[sender]);
于 2013-03-24T22:35:23.403 回答
-2

转换为开关并不是最优化的方式,因为它们对于每个“if”都是不同的值。但是,您可以执行 for 循环。

for(var i = 0; i < 4; i++){
   if (Object.ReferenceEquals(sender, "c" + i)) { spotClick(i); }
}

我猜在 C# 中连接 "c" + i 会是这样的

string.Format("c{0}",i);

于 2013-03-24T22:36:22.467 回答