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