如何优化下面的代码,下面的代码包含一个可能具有不同类型的类对象的对象数组。我宁愿转移案例而不是if ... else ......我怎么能这样做。
object[] emailObjs;
for (int i = 0; i < emailObjs.Length; i++)
{
if (emailObjs[i] != null)
{
if (emailObjs[i] is Rfq)
{
}
else if (emailObjs[i] is RfqBid)
{
}
else if (emailObjs[i] is RfqProjManager)
{
}
}
}
答案 0 :(得分:2)
在带有类型检查的switch
语句中使用C# 7 pattern matching:
switch (emailObjs[i])
{
case Rfq r:
{
// use r;
break;
}
case RfqBid r:
{
// use r;
break;
}
}
虽然这会显着地压缩代码,但在性能方面它不会比一堆if
语句带来太多好处,例如在示例代码中。
答案 1 :(得分:1)
这是我的尝试:
Rfq,RfqBid和RfqProjManager实现相同的接口。我们称之为IRfq。
interface
{
void DoSomeWork();
}
然后,你的for循环可能是这样的:
for (int i = 0; i < emailObjs.Length; i++)
{
if (emailObjs[i] != null && emailObjs is IRfq)
{
((IRfq)emailObjs[i]).DoSomeWork();
}
}
您的设计是否可行?
答案 2 :(得分:0)
使用一种方法定义所有3个类的通用接口:
public interface IRfq
{
void DoSomething();
}
public class Rfq : IRfq
{
public void DoSomething()
{
//...
}
}
public class RfqBid : IRfq
{
public void DoSomething()
{
//...
}
}
public class RfqProjManager : IRfq
{
public void DoSomething()
{
//...
}
}
你可以在你的for循环中只做一次调用。
IRfq[] emailObjs;
for (int i = 0; i < emailObjs.Length; i++)
{
emailObjs[i]?.DoSomething();
}