共用方式為


索引屬性

定義對已排序資料進行抽象的類別時,在不公開基礎實作的情況下,提供該資料的索引存取有時可能會很有幫助。 這是使用 Item 成員完成的。

語法

運算式的語法:

// Looking up an indexed property
expr[idx]

/// Assign to an indexed property
expr[idx] <- elementExpr

成員宣告的語法:

// Indexed property that can be read and written to
member self-identifier.Item
    with get(index-values) =
        get-member-body
    and set index-values values-to-set =
        set-member-body

// Indexed property can only be read
member self-identifier.Item
    with get(index-values) =
        get-member-body

// Indexed property that can only be set
member self-identifier.Item
    with set index-values values-to-set =
        set-member-body

備註

上一個語法的格式示範如何定義同時具有 getset 方法、只有 get 方法,或是只有 set 方法的索引屬性。 您也可以合併針對 get 顯示的語法,以及只針對 set 顯示的語法,產生同時具有 get 和 set 的屬性。 後面這種格式可讓您將不同的可存取性修飾元和屬性放在 get 和 set 方法上。

藉由使用名稱 Item,編譯器會將屬性視為預設的索引屬性。 您可以在物件執行個體上使用類似陣列的語法來存取預設索引屬性。 例如,如果 o 是定義這個屬性之型別的物件,則會使用 o[index] 語法來存取該屬性。

存取非預設索引屬性的語法是提供屬性的名稱和括弧中的索引,就像一般成員一樣。 例如,如果 o 上的屬性稱為 Ordinal,您可以寫入 o.Ordinal(index) 以存取它。

無論您使用何種格式,應一律在索引屬性上針對 set 方法使用 curried 格式。 如需 curried 函式的相關資訊,請參閱函式

在 F# 6 之前,語法 expr.[idx] 用於編製索引。 您可以啟用選擇性的告知性警告(/warnon:3366 或屬性 <WarnOn>3366</WarnOn>),以報告 expr.[idx] 標記法的使用情況。

範例

下列程式碼範例說明具有 get 和 set 方法之預設和非預設索引屬性的定義和使用方式。

type NumberStrings() =
    let mutable ordinals =
        [| "one"
           "two"
           "three"
           "four"
           "five"
           "six"
           "seven"
           "eight"
           "nine"
           "ten" |]

    let mutable cardinals =
        [| "first"
           "second"
           "third"
           "fourth"
           "fifth"
           "sixth"
           "seventh"
           "eighth"
           "ninth"
           "tenth" |]

    member this.Item
        with get (index) = ordinals[index]
        and set index value = ordinals[index] <- value

    member this.Ordinal
        with get (index) = ordinals[index]
        and set index value = ordinals[index] <- value

    member this.Cardinal
        with get (index) = cardinals[index]
        and set index value = cardinals[index] <- value

let nstrs = new NumberStrings()
nstrs[0] <- "ONE"

for i in 0..9 do
    printf "%s " nstrs[i]

printfn ""

nstrs.Cardinal(5) <- "6th"

for i in 0..9 do
    printf "%s " (nstrs.Ordinal(i))
    printf "%s " (nstrs.Cardinal(i))

printfn ""

輸出

ONE two three four five six seven eight nine ten
ONE first two second three third four fourth five fifth six 6th
seven seventh eight eighth nine ninth ten tenth

具有多個索引值的索引屬性

索引屬性可以有多個索引值。 在此情況下,使用屬性時,這些值會以逗號分隔。 這類屬性中的 set 方法必須有兩個 curried 引數,第一個是包含索引鍵的元組,第二個是要設定的值。

下列程式碼示範如何搭配多個索引值使用索引屬性。

open System.Collections.Generic

/// Basic implementation of a sparse matrix based on a dictionary
type SparseMatrix() =
    let table = new Dictionary<(int * int), float>()
    member _.Item
        // Because the key is comprised of two values, 'get' has two index values
        with get(key1, key2) = table[(key1, key2)]

        // 'set' has two index values and a new value to place in the key's position
        and set (key1, key2) value = table[(key1, key2)] <- value

let sm = new SparseMatrix()
for i in 1..1000 do
    sm[i, i] <- float i * float i

另請參閱