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

时间:2013-03-24 22:25:26

标签: c#

如何将以下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); }
}

3 个答案:

答案 0 :(得分:1)

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

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

spotClick(map[sender]);

答案 1 :(得分: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); }
}
如果两个对象都为null(检查here),那么

ReferenceEquals方法也返回true,这可能产生多个比较为真(执行多个sporClick调用),但在正常情况下,我们不能指望{自sender事件触发后,{1}}为null,因此这是一个合法的代码,相当于您发布的代码。如果c0,c1,c2和c3是常量表达式,则可以将此类代码转换为使用Click语句,但正如我们所看到的,它们是引用从switch类派生的类型的对象的变量因此无法在Control中使用(检查here)。因此,您无法将此代码转换为case

答案 2 :(得分:-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)的;