我们推荐编写短小简洁的方法,而不是冗长复杂的方法,主要的原因在于.NET的JIT机制。
当使用C#代码编写的程序在运行时,需要经历两个步骤:1)C#编译器将我们编写的源代码编译为IL中间代码;2)CLR通过调用JIT编译器将IL代码转换成本地机器代码。这两个步骤会分摊在整个应用程序运行的过程中。CLR并不会再应用程序启动时对整个应用程序做JIT编译,而是以方法为单位进行JIT编译。这可以在相当程度上减少程序的启动时间,同时也防止程序由于较多代码需要jIT编译而响应很慢,那些没有被调用的方法是不会被JIT编译的。因此通过将代码编写为多个短小简洁的方法,我们可以减少需要JIT编译的工作量,来尽量提升应用程序的性能。
短小简洁的方法还可以使得JIT编译器更容易支持enregistration,enregistration指选择哪些局部变量放入寄存器中存储,而不存储在堆栈中,较少的局部变量将使得JIT编译器更容易做最合适的enregistration选择,同时方法中控制流的简单性也影响着JIT编译器如何做更好的enregistration。
JIT编译器还会对内联方法做决定,内联意味着将函数调用直接替换为函数体内的代码,例如属性中的get和set访问器,就会被看做是内联方法。
思考:关于属性的get和set访问器,我记得在Jeffrey的书中,曾经说过在IL中get和set访问器会被转换成方法,那么还算是内联吗?内联和C#中的匿名方法有什么区别?如果您知道,欢迎给出一个解释。