首先, 我试图做一些像:
class Class1
{
public void Do()
{
}
}
class Class2
{
public void Do()
{
}
}
...
if (o is Class1)
{
Class1 c = (Class1)o;
c.Do();
}
if (o is Class2)
{
Class2 c = (Class2)o;
c.Do();
}
但是fxcop告诉我: 性能规则,尽可能避免重复转换,因为与它们相关的成本。缓存 'as'运算符的结果......
所以我做完了:
Class1 c1 = o as Class1;
Class2 c2 = o as Class2;
if (c1 != null)
c1.Do();
if (c2 != null)
c2.Do();
并且没有更多的fxcop错误。 但我试着测量它是否真的是一个很好的性能规则:
static void Main()
{
object o = new Class1();
int cst = 100000000;
Stopwatch sw1 = new Stopwatch();
Stopwatch sw2 = new Stopwatch();
sw1.Start();
for (int i = 0; i < cst; i++)
{
GoodPerf(o);
}
sw1.Stop();
var t1 = sw1.ElapsedMilliseconds;
sw2.Start();
for (int i = 0; i < cst; i++)
{
BadPerf(o);
}
sw2.Stop();
var t2 = sw2.ElapsedMilliseconds;
Console.WriteLine(t1);
Console.WriteLine(t2);
}
private static void BadPerf(object o)
{
if (o is Class1)
{
Class1 c = (Class1)o;
c.Do();
}
if (o is Class2)
{
Class2 c = (Class2)o;
c.Do();
}
}
private static void GoodPerf(object o)
{
Class1 c1 = o as Class1;
Class2 c2 = o as Class2;
if (c1 != null)
c1.Do();
if (c2 != null)
c2.Do();
}
它显示:
2090
1725
2090应该是最好的......
所以......我在问我是否真的应该遵循这条规则...... 也许,我不纠正好方法......
感谢您的回答
答案 0 :(得分:1)
FxCop并不总是正确的,它有时过于简单化,这是最常见的场景之一。除非你投射3到4次,否则你不会超过as
运算符的成本...但是FxCop规则不会像这样检查,它只是&gt; 1
也许用4.0 VS版本检查会更好吗?我认为,因为dynamic
在那里,他们不得不重新审视这些规则,但我们不会知道它可能会发布。测试版2我目前仍然会检查您发布的样式,在这种情况下给出一些不好的建议IMO。
然而,请记住,这在性能方面是微不足道的,除非你循环数十万次,否则不用担心。
要记住的其他事情,如果你看看IL,那么部分时间它就是该死的东西,让警告完全没用。