Freigeben über


Indizierte Eigenschaften (F#)

Indizierte Eigenschaften sind Eigenschaften, die arrayähnlichen Zugriff auf geordnete Daten bieten.

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

Hinweise

Die drei Formen der vorherigen Syntax zeigen, wie indizierte Eigenschaften definiert werden, die sowohl über die get-Methode als auch die set-Methode, nur über die get-Methode oder nur über die set-Methode verfügen. Sie können auch die Syntax für die ausschließliche Verwendung der get-Methode und die Syntax für die ausschließliche Verwendung der set-Methode kombinieren und eine Eigenschaft erzeugen, die sowohl über get als auch über set verfügt. Diese Form ermöglicht es Ihnen, für die get-Methode und die set-Methode unterschiedliche Zugriffsmodifizierer und -attribute festzulegen.

Wenn der PropertyName Item lautet, behandelt der Compiler die Eigenschaft als indizierte Standardeigenschaft. Eine indizierte Standardeigenschaft ist eine Eigenschaft, auf die Sie mit arrayähnlicher Syntax für die Objektinstanz zugreifen können. Wenn beispielsweise obj ein Objekt des Typs ist, der die Eigenschaft definiert, wird für den Zugriff auf die Eigenschaft die Syntax obj.[index] verwendet.

In der Syntax für den Zugriff auf eine indizierte nicht standardmäßige Eigenschaft werden der Name der Eigenschaft und der Index in Klammern angegeben. Wenn die Eigenschaft beispielsweise Ordinal lautet, schreiben Sie obj.Ordinal(index), um auf sie zuzugreifen.

Unabhängig von der verwendeten Form sollten Sie für eine indizierte Eigenschaft immer die Curry-Form der set-Methode verwenden. Informationen über Curry-Funktionen finden Sie unter Funktionen (F#).

Beispiel

Im folgenden Codebeispiel werden die Definition und Verwendung von indizierten Standardeigenschaften und indizierten nicht standardmäßigen Eigenschaften veranschaulicht, die über die get-Methode und die set-Methode verfügen.

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

Indizierte Eigenschaften mit mehreren Indexvariablen

Indizierte Eigenschaften können über mehrere Indexvariablen verfügen. In diesem Fall werden die Variablen durch Kommas getrennt, wenn die Eigenschaft verwendet wird. Die set-Methode in einer solchen Eigenschaft muss über zwei Curry-Argumente verfügen. Dabei ist das erste Argument ein Tupel, das die Schlüssel enthält, und das zweite Argument ist der Wert, der festgelegt wird.

Im folgenden Code wird die Verwendung einer indizierten Eigenschaft mit mehreren Indexvariablen veranschaulicht.

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

Siehe auch

Konzepte

Member (F#)