インデクサプロパティ

メソッドと同様に、プロパティも引数を取ることが出来、 そのようなプロパティのことをインデクサプロパティと呼びます。 特に次に説明するItemプロパティを用いることで 普通の配列と同じような方法で自作クラスにアクセスできるようになります。 インデクサプロパティを利用するには、メンバ名の後にwithを用います。 その際、値を参照する場合はget,値を設定する場合はsetアクセサを定義します。
インデクサプロパティItem
type JokeArray = class
    val private data : int array
    new (ar) as this = {data = Array.copy ar}
    member x.Item
        with get i = x.data.[i-i%2]
        and set i v = x.data.[i-i%2]<-v
    end;;
let a = new JokeArray([|0..9|]) in
//値の設定
a.[7]<-10;
//値の参照
for i=0 to 9 do print_int (a.Item(i));print_endline "" done
//値の参照(Itemという名前のプロパティの場合のみ)
for i=0 to 9 do print_int a.[i];print_endline "" done;
このプログラムは、奇数番目のデータを無視して 偶数番目と同じデータを返したり設定したりできる ジョークのような配列クラスJokeArrayの定義です。 getを定義することでobj.プロパティ名(インデックス)という形式で 値を参照することが出来るようになります。 また、Itemという変数名の場合のみ 配列と同様の[]によるアクセスを行うことができます(最下段)。 また、setを定義することで<-によって値を設定することが可能になります。 値を設定できるようにするにはもちろん、 内部的にmutableなデータを持っている必要があります。 その他情報として、Foundations of F#によると Itemという名前以外でインデクサプロパティを用いた場合 他の.Net languageからそのクラスを利用することは難しくなるとあります。 そのため、他の言語からの相互運用を考えている場合は 常にItemという名前でインデクサを定義するほうが良いと思います。