Compartir a través de


Propiedades indizadas (F#)

Las propiedades indizadas son propiedades que proporcionan acceso a datos ordenados como si fueran matrices.

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

Comentarios

Las tres formas de la sintaxis anterior muestran cómo definir propiedades indizadas que tienen un método set y get, únicamente un método get, o bien únicamente un método set. También se pueden combinar la sintaxis mostrada para get únicamente y la mostrada para set únicamente, y generar una propiedad que tenga tanto get como set. Esta última forma permite colocar distintos modificadores y atributos de accesibilidad a los métodos get y set.

Cuando PropertyName es Item, el compilador trata la propiedad como una propiedad indizada predeterminada. Una propiedad indizada predeterminada es una propiedad a la que se puede tener acceso mediante una sintaxis de matriz para la instancia de objeto. Por ejemplo, si obj es un objeto del tipo que define esta propiedad, se utiliza la sintaxis obj.[index] para tener acceso a la propiedad.

La sintaxis para tener acceso a una propiedad indizada no predeterminada consiste en proporcionar el nombre de la propiedad y el índice entre paréntesis. Por ejemplo, si la propiedad es Ordinal, se escribe obj.Ordinal(index) para tener acceso a ella.

Con independencia de la forma utilizada, siempre se debe usar la forma currificada para el método set con una propiedad indizada. Para obtener información acerca de las funciones currificadas, vea Funciones (F#).

Ejemplo

En el ejemplo de código siguiente, se muestran la definición y el uso de las propiedades indizadas predeterminada y no predeterminada que tienen métodos set y get.

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

Output

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

Propiedades indizadas con varias variables de índice

Las propiedades indizadas pueden tener más de una variable de índice. En ese caso, las variables se separan por comas cuando se utiliza la propiedad. El método set de este tipo de propiedad debe tener dos argumentos currificados, el primero de ellos es una tupla que contiene las claves, y el segundo es el valor que se va a establecer.

En el código siguiente se muestra el uso de una propiedad indizada con varias variables de índice.

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

Vea también

Conceptos

Miembros (F#)