c#:这段代码会被优化掉吗?

Chr*_*way 1 c# compiler-optimization

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

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);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是编译器会完全优化出来吗?当我在Reflector中查看已编译的程序集时,它显示了以下内容:

try
{
    i = this.strOriginalData.IndexOf("\r\n");
}
catch (Exception exception1)
{
    ex = exception1;
}
Run Code Online (Sandbox Code Playgroud)

i的声明已移至方法的顶部,而Exception类型的附加声明也位于方法的顶部.

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

Dom*_*nic 13

因此,正如您通过Reflector发现的那样,C#编译器不会优化它.无论是JIT编译器将是另外一个问题.但是,我猜这个答案几乎肯定不是.

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

public int IndexOf()
{
   CallAWebService();
}
Run Code Online (Sandbox Code Playgroud)

显然,在这种情况下,优化该线路将是不好的.


Jon*_*eet 6

编译器如何知道IndexOf没有副作用?

所以基本上没有,它不会优化它.