Partager via


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

Voir aussi

Concepts

Membres (F#)