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 Item
kompilá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:3366
nebo vlastnost <WarnOn>3366</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