比方说,如果我想集中测试一些继承类的类型,并且需要良好的性能,我应该使用enum存储所有可能的类型,并使用枚举相等来测试类型而不是使用is.
例如
switch (myObject.Type)
{
case myType.type1:
myObject as myInheritedObject1;
...
break;
case myType.type2:
myObject as myInheritedObject2;
...
break;
case myType.type3:
myObject as myInheritedObject3;
...
break;
...
}
Run Code Online (Sandbox Code Playgroud)
要么
var tmp = myObject as myInheritedObject1;
if (tmp != null)
{
}
else
{
tmp = myObject as myInheritedObject2;
if (tmp != null)
{
}
else
{
tmp = myObject as myInheritedObject3;
if (tmp != null)
{
}
} }}
Run Code Online (Sandbox Code Playgroud)
Eri*_*ert 10
比方说,如果我想集中测试一些继承类的类型,并且需要良好的性能,我应该使用枚举存储所有可能的类型,并使用枚举相等来测试类型而不是使用
is?
这种机制通常被称为"歧视型",即FYI.
答案是:这取决于您的性能要求.歧视类型有许多缺点:
switch忘记案例并在运行时可怕地死亡或者做一些疯狂的事情是非常容易的.它们的优势在于它们实际上比进行类型测试略快.
因此,解决此问题的方法与解决任何其他性能问题的方法相同:
is不符合您的要求,那么评估是否对有区别的类型进行更改会导致程序满足您的要求.如果确实如此,那么考虑这样做的成本并做出相应的决定.如果没有,那么你有一个更大的问题要解决,所以首先解决这个问题.在Roslyn团队中,我们以各种可能的方式限制了性能要求,因此我们非常仔细地考虑了这个问题.我们决定采用在整个Roslyn中使用歧视类型的一般策略.这意味着我们必须非常小心我们设计交换机的方式,类型层次结构等等.我们还拥有一支专业的绩效团队,每天都会根据客户要求确认我们的绩效.
我们的要求与绝大多数业务线开发人员的性能要求完全不同; 您不应该使用Roslyn代码作为确保良好性能的模型.相反,您应该使用我们的方法作为确保良好性能的模型:设定目标,经常测量,并且只有在这样做时才进行体系结构更改才能真正解决现有问题.