複雑なことをしない限り、クラスの代わりにレコードを使用することをお勧めします。不変性、構造的平等、パターンマッチングなど:
type Playlists = {
Albums: DbSet;
Genres: DbSet
}
あなたが簡単にレコードのフィールドを取得することができます:基本的に、彼らは余分な機能を持つクラスでデフォルトレコードのフィールドに
let p = {Albums = ...; Genres = ...}
let albums = p.Albums
let genres = p.Genres
は不変ですが。レコード内に可変フィールドを宣言することはできますが、悪い習慣とみなされます。プロパティを設定することはできませんが、古いレコードから新しいレコードを作成できます。推奨される明示的なパラメータで、このコンストラクタを使用して、
let p = {Albums = a; Genres = g}
// Create new records by updating one field
let p1 = {p with Albums = a1}
let p2 = {p with Genres = g2}
あなたはクラスを作成するために主張する場合:デフォルトの不変性は、さらに、それは程度の理由コードは、より機能的かつ容易になり、通常は問題ではありません
type Playlists(a: DbSet, g: DbSet) =
let mutable albums = a
let mutable genres = g
// ...
デフォルトコンストラクタを使用して、非NULL可能フィールドにUnchecked.default<'T>
を使用するか、またはより自分の既定のコンストラクタを使用することができ、必要である:
// Set fields using dump values
let mutable albums = new DbSet()
let mutable genres = new DbSet()
しかし、これらのフィールドを実際に使用する前に設定することを確認してください。あなただけ読み取り専用プロパティを必要とするとき、あなたが可変プロパティを必要とするとき
出典
2012-02-08 09:55:53
pad
一つのこと - パッドのとTomasPetricekの優秀な答えに加えて:あなたは本当に「機能」になろうとしているならば、私はあなたがクラスを必要とする仮定やクラス - を調べます最初の場所でのような構造。自動プロパティは、特定のクラスの内部をアプリケーションの残りの部分に公開することによって、優れた情報隠蔽に違反します。アプリケーションの残りの部分に公開されているクラスの内部が必要な場合は、まずクラスを必要としないことがあります。私はあなたが本当に機能的にすべてがクラス内になければならないという考えを取り除くと思っていたいと思っていると言います。 –
ああ、もう1つ - あなたが取り組んでいることを考えれば、このブログの投稿が役立つかもしれません。http://bugsquash.blogspot.com/2011/11/lenses-in-f.html –