Dizini Oluşturulan Özellikler

Sıralı verileri soyutlayan bir sınıf tanımlarken, bazen temel alınan uygulamayı göstermeden bu verilere dizinli erişim sağlamak yararlı olabilir. Bu işlem üyeyle Item yapılır.

Sözdizimi

İfadeler için söz dizimi:

// Looking up an indexed property
expr[idx]

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

Üye bildirimleri için söz dizimi:

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

Açıklamalar

Önceki söz diziminin formları hem hem getset de yöntemi olan, get yalnızca yöntemi olan veya set yalnızca yöntemi olan dizine alınan özelliklerin nasıl tanımlandığını gösterir. Ayrıca hem yalnızca alma için gösterilen söz dizimini hem de yalnızca küme için gösterilen söz dizimini birleştirebilir ve hem get hem de set içeren bir özellik oluşturabilirsiniz. Bu ikinci form, get ve set yöntemlerine farklı erişilebilirlik değiştiricileri ve öznitelikleri yerleştirmenizi sağlar.

derleyicisi, adını Itemkullanarak özelliği varsayılan dizinli özellik olarak kabul eder. Varsayılan dizinli özellik, nesne örneğinde dizi benzeri söz dizimi kullanarak erişebileceğiniz bir özelliktir. Örneğin, bu özelliği tanımlayan türün bir nesnesiyse o , söz dizimi o[index] özelliğine erişmek için kullanılır.

Varsayılan olmayan bir dizinli özelliğe erişmek için söz dizimi, özelliğin adını ve dizini aynı normal bir üye gibi parantez içinde sağlamaktır. Örneğin, üzerindeki o özelliği olarak adlandırılırsa Ordinal, buna erişmek için yazarsınız o.Ordinal(index) .

Hangi formu kullandığınızdan bağımsız olarak, dizinli bir özellikte küme yöntemi için her zaman curried formunu kullanmanız gerekir. Curried işlevleri hakkında bilgi için bkz . İşlevler.

F# 6'nın öncesinde söz dizimi expr.[idx] dizin oluşturmak için kullanılıyordu. Gösterimin kullanımlarını bildirmek için isteğe bağlı bir bilgilendirme uyarısını expr.[idx] (/warnon:3366 veya özelliğini<WarnOn>3366</WarnOn>) etkinleştirebilirsiniz.

Örnek

Aşağıdaki kod örneği, alma ve ayarlama yöntemlerine sahip varsayılan ve varsayılan olmayan dizine alınan özelliklerin tanımını ve kullanımını gösterir.

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

Çıktı

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

Birden çok dizin değerine sahip Dizinli Özellikler

Dizine alınan özelliklerin birden fazla dizin değeri olabilir. Bu durumda, özellik kullanıldığında değerler virgülle ayrılır. Böyle bir özellikteki set yönteminin iki curried bağımsız değişkeni olmalıdır. Bunlardan ilki anahtarları içeren bir tanımlama grubu, ikincisi ise ayarlanacağı değerdir.

Aşağıdaki kod, birden çok dizin değeriyle dizine alınan bir özelliğin kullanımını gösterir.

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

Ayrıca bkz.