Indizierte Eigenschaften

Beim Definieren einer Klasse, die geordnete Daten abstrahiert, kann es manchmal hilfreich sein, den indizierten Zugriff auf diese Daten zu ermöglichen, ohne die zugrunde liegende Implementierung verfügbar zu machen. Verwenden Sie dazu das Item-Member.

Syntax

Syntax für Ausdrücke:

// Looking up an indexed property
expr[idx]

/// Assign to an indexed property
expr[idx] <- elementExpr

Syntax für Memberdeklarationen:

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

Bemerkungen

Die Formen der vorherigen Syntax zeigen, wie indizierte Eigenschaften definiert werden, die sowohl über eine get- als auch über eine set-Methode verfügen, nur über eine get-Methode oder nur über eine set-Methode verfügen. Sie können auch die Syntax kombinieren, die für „get only“ angezeigt wird, und die Syntax, die „set only“ angezeigt wird, und eine Eigenschaft erstellen, die sowohl „get“ als auch „set“ aufweist. Mit dieser letztgenannten Form können Sie verschiedene Bedienungshilfemodifizierer und Attribute für die get- und set-Methoden einfügen.

Unter Verwendung des Namens Item behandelt der Compiler die Eigenschaft als standardmäßig indizierte Eigenschaft. Eine standardmäßig indizierte Eigenschaft ist eine Eigenschaft, auf die Sie mithilfe einer arrayähnlichen Syntax für die Objektinstanz zugreifen können. Wenn beispielsweise o ein Objekt des Typs ist, der diese Eigenschaft definiert, wird die Syntax o[index] für den Zugriff auf die Eigenschaft verwendet.

Die Syntax für den Zugriff auf eine nicht standardmäßig indizierte Eigenschaft dient dazu, den Namen der Eigenschaft und den Index wie ein reguläres Member in Klammern anzugeben. Wenn die Eigenschaft für o beispielsweise Ordinal genannt wird, schreiben Sie o.Ordinal(index), um darauf zuzugreifen.

Unabhängig davon, welches Formular Sie verwenden, sollten Sie immer das Formular mit Currying für die set-Methode für eine indizierte Eigenschaft verwenden. Informationen zu Funktionen mit Currying finden Sie unter Funktionen.

Vor F# 6 wurde die Syntax expr.[idx] für die Indizierung verwendet. Sie können eine optionale Informationswarnung (/warnon:3566 oder Eigenschaft <WarnOn>3566</WarnOn>) aktivieren, um die Verwendung der expr.[idx]-Notation zu melden.

Beispiel

Das folgende Codebeispiel veranschaulicht die Definition und Verwendung von standardmäßigen und nicht standardmäßig indizierten Eigenschaften, die über get- und set-Methoden 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 Indexwerten

Indizierte Eigenschaften können mehrere Indexwerte aufweisen. In diesem Fall werden die Werte durch Kommas getrennt, wenn die -Eigenschaft verwendet wird. Die set-Methode in einer solchen Eigenschaft muss über zwei Argumente mit Currying verfügen, wobei das erste ein Tupel ist, das die Schlüssel enthält, und das zweite davon der festzulegende Wert ist.

Der folgende Code veranschaulicht die Verwendung einer indizierten Eigenschaft mit mehreren Indexwerten.

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

Siehe auch