Bagikan melalui


Properti Terindeks

Saat menentukan kelas yang mengabstraksikan data yang dipesan, terkadang menyediakan akses terindeks ke data tersebut tanpa mengekspos implementasi yang mendasarinya dapat membantu. Hal ini dilakukan dengan anggota Item.

Sintaks

Sintaks untuk ekspresi:

// Looking up an indexed property
expr[idx]

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

Sintaks untuk deklarasi anggota:

// 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

Keterangan

Formulir sintaks sebelumnya menunjukkan cara menentukan properti terindeks yang memiliki metode get dan set, hanya memiliki metode get, atau hanya memiliki metode set. Anda juga dapat menggabungkan sintaks yang ditunjukkan hanya untuk get dan sintaks yang ditunjukkan hanya untuk set, serta menghasilkan properti yang memiliki get dan set. Formulir yang terakhir ini memungkinkan Anda untuk menempatkan pengubah aksesibilitas dan atribut yang berbeda pada metode get dan set.

Dengan menggunakan nama Item, kompilator memperlakukan properti sebagai properti terindeks default. Properti terindeks default adalah properti yang dapat Anda akses dengan menggunakan sintaks seperti array pada instans objek. Misalnya, jika o adalah objek dari jenis yang menentukan properti ini, sintaks o[index] digunakan untuk mengakses properti.

Sintaks untuk mengakses properti terindeks non-default adalah dengan memberikan nama properti dan indeks dalam tanda kurung, seperti halnya anggota biasa. Misalnya, jika properti di o disebut Ordinal, Anda menulis o.Ordinal(index) untuk mengaksesnya.

Terlepas dari formulir mana yang Anda gunakan, Anda harus selalu menggunakan formulir curried untuk metode set pada properti terindeks. Untuk informasi tentang fungsi curried, lihat Functions.

Sebelum F# 6, sintaks expr.[idx] digunakan untuk pengindeksan. Anda dapat mengaktifkan peringatan informasi opsional (/warnon:3366 atau properti <WarnOn>3366</WarnOn>) untuk melaporkan penggunaan notasi expr.[idx].

Contoh

Contoh kode berikut menggambarkan definisi dan penggunaan properti terindeks default dan non-default yang memiliki metode get dan 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 ""

Output

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

Properti Terindeks dengan beberapa nilai indeks

Properti terindeks dapat memiliki lebih dari satu nilai indeks. Dalam hal ini, nilai tersebut dipisahkan oleh koma saat properti digunakan. Metode set dalam properti seperti itu harus memiliki dua argumen curried, yang pertama adalah tuple yang berisi kunci, dan yang kedua adalah nilai yang akan ditetapkan.

Kode berikut mendemonstrasikan penggunaan properti terindeks dengan beberapa nilai indeks.

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

Lihat juga