內嵌函式 (F#)
「內嵌函式」(Inline Function) 是直接整合至呼叫程式碼的函式。
使用內嵌函式
當您使用靜態型別參數時,任何透過型別參數所參數化的函式都必須是內嵌的。 這可保證編譯器能夠解析這些型別參數。 當您使用一般泛型型別參數時,則沒有這類限制。
除了啟用成員條件約束之外,內嵌函式也有助於最佳化程式碼。 不過,過度使用內嵌函式可能會讓程式碼較無法抵抗編譯器最佳化變更和程式庫函式實作。 因此,除非您已經嘗試過所有其他最佳化技巧,否則應避免使用內嵌函式進行最佳化。 讓函式或方法成為內嵌有時會改進效能,但實際情況不一定如此。 因此,您也應該使用效能測量,確認將任何指定的函式變成內嵌,確實對效能造成正面影響。
inline 修飾詞可以套用至類別最上層、模組層級或方法層級中的函式。
下列程式碼範例說明最上層的內嵌函式、內嵌執行個體方法和內嵌靜態方法。
let inline increment x = x + 1
type WrapInt32() =
member inline this.incrementByOne(x) = x + 1
static member inline Increment(x) = x + 1
內嵌函式和型別推斷
inline 的存在與否會影響型別推斷。 原因是內嵌函式可以具有以統計方式解析的型別參數,而非內嵌函式則沒有。 下列程式碼範例顯示如果您使用的函式具有以統計方式解析的型別參數 (float 轉換運算子),則 inline 十分有用。
let inline printAsFloatingPoint number =
printfn "%f" (float number)
如果沒有 inline 修飾詞,則型別推斷會強制函式採用特定型別,在此案例中是 int。 但是如果具有 inline 修飾詞,還是會將函式推斷為具有以統計方式解析的型別參數。 如果具有 inline 修飾詞,則會將型別推斷為下列項目:
^a -> unit when ^a : (static member op_Explicit : ^a -> float)
這表示函式接受任何支援轉換為 float 的型別。