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