内联函数 (F#)
“内联函数”是直接集成到调用代码中的函数。
使用内联函数
当使用静态类型参数时,由类型参数进行参数化的任何函数必须是内联的。 这可确保编译器能够解析这些类型参数。 当使用普通的泛型类型参数时,不存在这样的限制。
除了允许使用成员约束以外,内联函数对优化代码也很有帮助。 但是,若存在编译器优化和库函数实现这方面的更改,过多使用内联函数会导致代码的稳定性下降。 出于此原因,除非您已尝试了所有其他优化技术,否则应避免使用内联函数进行优化。 虽然使函数或方法内联有时可以提高性能,但也不总是这样。 因此,您还应使用性能度量方法,验证内联任何给定函数是否确实会对性能带来正面影响。
inline 修饰符可适用于顶级的函数、模块级的函数或类中方法级的函数。
下面的代码示例演示顶级的内联函数、内联实例方法以及内联静态方法。
let inline increment x = x + 1
type WrapInt32() =
member inline this.incrementByOne(x) = x + 1
static member inline Increment(x) = x + 1
内联函数和类型推理
inline 的存在会影响类型推理。 这是因为内联函数可具有静态解析的类型参数,而非内联函数没有。 下面的代码示例阐释了一种情况,inline 可在此情况中发挥作用,因为您使用的是一个具有静态解析的类型参数的函数(float 转换运算符)。
let inline printAsFloatingPoint number =
printfn "%f" (float number)
如果没有 inline 修饰符,类型推理将强制函数采用一个特定类型(在此例中为 int)。 但如果使用 inline 修饰符,则还会将该函数推断为具有静态解析的类型参数。 通过使用 inline 修饰符,将该类型推断为以下内容:
^a -> unit when ^a : (static member op_Explicit : ^a -> float)
这意味着,该函数接受支持到 float 的转换的任何类型。