Propriétés indexées (F#)
Les propriétés indexées sont des propriétés qui fournissent un accès de type tableau à des données ordonnées.
// Indexed property that has both get and set defined.
member self-identifier.PropertyName
with get(index-variable) =
get-function-body
and set index-variables value-variables =
set-function-body
// Indexed property that has get only.
member self-identifier.PropertyName(index-variable) =
get-function-body
// Alternative syntax for indexed property with get only
member self-identifier.PropertyName
with get(index-variables) =
get-function-body
// Indexed property that has set only.
member self-identifier.PropertyName
with set index-variables value-variables =
set-function-body
Notes
Les trois formes de la syntaxe précédente montrent comment définir des propriétés indexées qui ont à la fois une méthode get et set, uniquement une méthode get ou uniquement une méthode set. Vous pouvez aussi combiner la syntaxe indiquée pour get uniquement et celle indiquée pour set uniquement, et produire une propriété qui a à la fois get et set. Cette dernière forme vous permet de mettre différents modificateurs et attributs d'accessibilité sur les méthodes get et set.
Lorsque PropertyName a la valeur Item, le compilateur traite la propriété comme une propriété indexée par défaut. Une propriété indexée par défaut est une propriété à laquelle vous pouvez accéder en utilisant une syntaxe de type tableau sur l'instance de l'objet. Par exemple, si obj est un objet du type qui définit cette propriété, la syntaxe obj.[index] est utilisée pour accéder à la propriété.
La syntaxe pour accéder à une propriété indexée qui n'est pas une propriété indexée par défaut consiste à fournir le nom de la propriété et l'index entre parenthèses. Par exemple, si la propriété est Ordinal, vous écrivez obj.Ordinal(index) pour y accéder.
Quelle que soit la forme que vous utilisez, vous devez toujours utiliser la forme curryfiée pour la méthode set sur une propriété indexée. Pour plus d'informations sur les fonctions curryfiées, consultez Fonctions (F#).
Exemple
L'exemple de code suivant illustre la définition et l'utilisation de propriétés indexées, par défaut et non définies par défaut, qui possèdent les méthodes get et 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 ""
Sortie
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
Propriétés indexées avec plusieurs variables d'index
Les propriétés indexées peuvent avoir plusieurs variables d'index. Dans ce cas, les variables sont séparées par des virgules lorsque la propriété est utilisée. La méthode set dans une telle propriété doit avoir deux arguments curryfiés, le premier étant un tuple qui contient les clés et le second étant la valeur définie.
Le code suivant illustre l'utilisation d'une propriété indexée avec plusieurs variables d'index.
open System.Collections.Generic
type SparseMatrix() =
let mutable table = new Dictionary<(int * int), float>()
member this.Item
with get(key1, key2) = table.[(key1, key2)]
and set (key1, key2) value = table.[(key1, key2)] <- value
let matrix1 = new SparseMatrix()
for i in 1..1000 do
matrix1.[i, i] <- float i * float i