Поделиться через


Индексированные свойства (F#)

Индексированные свойства — это свойства, обеспечивающий к упорядоченным данным доступ, подобный доступу к массивам.

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

Заметки

В приведенных выше трех формах синтаксических конструкций показано, как определять индексированные свойства, имеющие и метод get, и метод set, только метод get или только метод set. Также можно комбинировать синтаксис, показанный для случаев "только метод get" и "только метод set", для получения свойства с обоими методами — и get, и set. Эта последняя форма позволяет добавлять к методам get и set различные модификаторы доступности и атрибуты.

Когда PropertyName — Item, компилятор рассматривает свойство как индексированное свойство по умолчанию. Индексированное свойство по умолчанию — это свойство, доступ к которому можно получать, используя применительно к экземпляру объекта синтаксис, подобный массиву. Например, если obj — объект типа, определяющего данное свойство, для доступа к свойству используется синтаксическая конструкция obj.[index].

Синтаксис для доступа к индексированному свойству, не являющемуся индексированным свойством по умолчанию, предполагает запись имени свойств и индекса в круглых скобках. Например, если имя свойства — Ordinal, для доступа к нему используется конструкция obj.Ordinal(index).

Вне зависимости от того, какая форма используется, применительно к индексированному свойству следует всегда использовать каррированную форму метода set. Дополнительные сведения о каррированных функциях см. в разделе Функции (F#).

Пример

Следующий пример кода иллюстрирует определение и использование индексированных свойств — по умолчанию и обычного — имеющих методы get и 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 ""

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

Индексированные свойства с несколькими переменными индекса

Индексированные свойства могут иметь более одной переменной индекса. В этом случае при использовании свойства переменные разделяются запятыми. Метод set в таком свойстве должен иметь два каррированных аргумента, первый из которых представляет собой кортеж, содержащий ключи, а второй — задаваемое значение.

В следующем коде демонстрируется использование индексированного свойства с несколькими переменными индекса.

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

См. также

Основные понятия

Члены (F#)