1

我正在查看第三方外包公司提供给我们的一些代码,并遇到了这个小宝石:

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 类型的附加声明也在方法的顶部。

所以,由于这段代码并没有真正做任何事情,我想知道编译器是否足够聪明,可以看到这段代码什么都不做并且可以优化它。

4

3 回答 3

13

因此,正如您通过 Reflector 发现的那样,C# 编译器不会对其进行优化。JIT 编译器是否会是另一个问题。但是,我猜答案几乎肯定不是。

为什么?因为 JIT 编译器不知道这IndexOf是一个无聊的方法。换句话说,就 JIT 编译器所知,string.IndexOf可以定义为

public int IndexOf()
{
   CallAWebService();
}

显然,在这种情况下优化那条线会很糟糕。

于 2010-12-02T17:25:07.600 回答
6

编译器怎么知道IndexOf没有副作用?

所以基本上不,它不会优化它。

于 2010-12-02T17:24:39.687 回答
2

不,它不会被优化。

另一方面,它是一个非常小的的开销。与 string.IndexOf() 设置 catch 块的成本相比,可以忽略不计。

如果有例外,那将是有代价的,但这不太可能。

于 2010-12-02T17:44:52.897 回答