Dan*_*ury 2 c# compiler-optimization
编辑:这个问题是基于GetType()返回一个字符串的误解.
我正在努力更好地处理C#的工作原理,所以这个问题更具理论性而非实际性.
据我了解,在值类型上调用GetType需要装箱,然后调用方法.但是由于值类型不能继承,但是类型在编译时是已知的,那么为什么编译器不能简单地用字符串文字替换对GetType()的调用?
或者这是可以完成的事情,但是认为没有必要,因为无论如何都不需要在未装箱的值类型上调用GetType?
如果您没有误解GetType返回字符串,那么让我们考虑您可能会问过的问题.编译器可以编译吗?
Foo foo = whatever;
Type t = foo.GetType();
Run Code Online (Sandbox Code Playgroud)
如
Type t = typeof(Foo);
Run Code Online (Sandbox Code Playgroud)
是的,这将是一个合法的优化.编译器不进行这种优化,因为如果编译器团队可以进行实际上有所不同的优化,那么编译器团队就会浪费时间进行优化.让我们考虑一下拟议的优化问题.
new GetType方法Foo吗?如果是这样,那么它可以做任何事情.编译器团队必须检测对原始的调用GetType.然后编写测试用例,确保在这些情况下不应用优化.Foo?而不是Foo,所以你必须拥有该编译器的一个特例.因此,出于所有这些原因以及更多原因,优化的成本高于其产生的效益.
有关如何评估建议的优化的更长但类似的讨论,请参阅昨天的答案:c#编译器的奇怪行为,因为缓存委托