我正在审查第三方外包公司提供给我们的一些代码并碰到了这个小宝石:
try
{
int i = strOriginalData.IndexOf("\r\n");
////System.Diagnostics..EventLog.WriteEntry("i", i.ToString());
}
catch (System.Exception ex)
{
////System.Diagnostics..EventLog.WriteEntry("ex", ex.Message);
}
我的问题是编译器会完全优化这个吗?当我在Reflector中查看已编译的程序集时,它会显示:
try
{
i = this.strOriginalData.IndexOf("\r\n");
}
catch (Exception exception1)
{
ex = exception1;
}
i的声明已移至方法的顶部,并且该方法的顶部还附加了Exception类型的声明。
所以,由于这段代码没有真正做任何事情,我想知道编译器是否足够聪明,看到这段代码什么都不做,可以优化它。
答案 0 :(得分:13)
因此,正如您通过Reflector找到的那样, C#编译器将不会优化它。是否 JIT编译器将是另一个问题。但是,我猜我的答案几乎肯定不是。
为什么呢?因为JIT编译器不知道IndexOf
是一种无聊的方法。换句话说,就JIT编译器而言,string.IndexOf
可以定义为
public int IndexOf()
{
CallAWebService();
}
显然,在这种情况下,优化这条线会很糟糕。
答案 1 :(得分:6)
编译器如何知道IndexOf
没有副作用?
所以基本上没有,它不会优化它。
答案 2 :(得分:2)
不,它不会被优化。
另一方面,它是非常小的开销。与string.IndexOf()的成本相比,设置catch块可以忽略不计。
如果有异常会有成本,但这不太可能。