Udostępnij za pośrednictwem


Właściwości indeksowane

Podczas definiowania klasy, która abstrahuje od uporządkowanych danych, czasami pomocne może być zapewnienie indeksowanego dostępu do tych danych bez uwidaczniania podstawowej implementacji. Odbywa się to z elementem Item członkowskim.

Składnia

Składnia wyrażeń:

// Looking up an indexed property
expr[idx]

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

Składnia deklaracji składowych:

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

Uwagi

Formularze poprzedniej składni pokazują, jak zdefiniować właściwości indeksowane, które mają zarówno get metodę, jak i set metodę, mają tylko metodę get lub mają tylko metodę set . Można również połączyć zarówno składnię wyświetlaną dla polecenia get, jak i składnię wyświetlaną tylko dla zestawu, oraz utworzyć właściwość, która ma zarówno get, jak i set. Ten ostatni formularz umożliwia umieszczenie różnych modyfikatorów i atrybutów ułatwień dostępu w metodach get i set.

Używając nazwy Item, kompilator traktuje właściwość jako domyślną właściwość indeksowaną. Domyślna właściwość indeksowana to właściwość , do której można uzyskać dostęp przy użyciu składni podobnej do tablicy w wystąpieniu obiektu. Jeśli na przykład o jest obiektem typu definiującego tę właściwość, składnia o[index] jest używana do uzyskiwania dostępu do właściwości.

Składnią dostępu do właściwości indeksowanej innej niż domyślna jest podanie nazwy właściwości i indeksu w nawiasach, podobnie jak zwykły element członkowski. Jeśli na przykład właściwość w o systemie nosi nazwę Ordinal, zapisujesz o.Ordinal(index) ją, aby uzyskać do niej dostęp.

Niezależnie od tego, którego formularza używasz, zawsze należy użyć formularza curried dla metody set we właściwości indeksowanej. Aby uzyskać informacje o funkcjach curried, zobacz Funkcje.

Przed F# 6 składnia expr.[idx] była używana do indeksowania. Możesz aktywować opcjonalne ostrzeżenie informacyjne (/warnon:3366 lub właściwość <WarnOn>3366</WarnOn>) w celu raportowania expr.[idx] użycia notacji.

Przykład

Poniższy przykład kodu ilustruje definicję i użycie domyślnych i nie domyślnych właściwości indeksowanych, które mają metody pobierania i ustawiania.

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

Wyjście

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

Właściwości indeksowane z wieloma wartościami indeksu

Właściwości indeksowane mogą mieć więcej niż jedną wartość indeksu. W takim przypadku wartości są rozdzielane przecinkami, gdy właściwość jest używana. Metoda set w takiej właściwości musi mieć dwa argumenty curried, z których pierwsza jest krotką zawierającą klucze, a druga jest wartością do ustawienia.

Poniższy kod demonstruje użycie właściwości indeksowanej z wieloma wartościami indeksu.

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

Zobacz też