Indexované vlastnosti

Při definování třídy, která abstrahuje přes uspořádaná data, může být někdy užitečné poskytnout indexovaný přístup k datům bez zveřejnění podkladové implementace. To se provádí u člena Item .

Syntaxe

Syntaxe výrazů:

// Looking up an indexed property
expr[idx]

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

Syntaxe pro deklarace členů:

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

Poznámky

Formy předchozí syntaxe ukazují, jak definovat indexované vlastnosti, které mají jak get metodu, tak metodu set , pouze metodu get nebo pouze metodu set . Můžete také zkombinovat syntaxi zobrazenou pouze pro získání a syntaxi zobrazenou pouze pro sadu a vytvořit vlastnost, která má hodnotu get i set. Tento druhý formulář umožňuje vložit různé modifikátory a atributy přístupnosti na metody get a set.

Pomocí názvu Itemkompilátor považuje vlastnost za výchozí indexovanou vlastnost. Výchozí indexovaná vlastnost je vlastnost, ke které můžete přistupovat pomocí syntaxe podobné pole v instanci objektu. Pokud je například o objekt typu, který definuje tuto vlastnost, syntaxe o[index] se používá pro přístup k vlastnosti.

Syntaxe pro přístup k ne defaultní indexované vlastnosti je zadat název vlastnosti a index v závorkách, stejně jako běžný člen. Pokud je například vlastnost o volána Ordinal, zapíšete o.Ordinal(index) pro přístup k ní.

Bez ohledu na to, který formulář používáte, byste vždy měli použít složený formulář pro metodu set u indexované vlastnosti. Informace o složených funkcích naleznete v tématu Funkce.

Před F# 6 se syntaxe expr.[idx] použila k indexování. Můžete aktivovat volitelné informační upozornění (/warnon:3566 nebo vlastnost <WarnOn>3566</WarnOn>) pro hlášení použití expr.[idx] notace.

Příklad

Následující příklad kódu znázorňuje definici a použití výchozích a ne-výchozích indexovaných vlastností, které mají metody get a 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 ""

Výstup

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

Indexované vlastnosti s více hodnotami indexu

Indexované vlastnosti mohou mít více než jednu hodnotu indexu. V takovém případě jsou hodnoty odděleny čárkami při použití vlastnosti. Metoda set v takové vlastnosti musí mít dva složené argumenty, první z nichž je řazená kolekce členů obsahující klíče, a druhý z toho je hodnota, která se má nastavit.

Následující kód ukazuje použití indexované vlastnosti s více hodnotami indexu.

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

Viz také