Vlastnosti (F#)
Vlastnosti jsou členy, které představují hodnoty přidružené k objektu.
// Property that has both get and set defined.
[ attributes ]
[ static ] member [accessibility-modifier] [self-identifier.]PropertyName
with [accessibility-modifier] get() =
get-function-body
and [accessibility-modifier] set parameter =
set-function-body
// Alternative syntax for a property that has get and set.
[ attributes-for-get ]
[ static ] member [accessibility-modifier-for-get] [self-identifier.]PropertyName =
get-function-body
[ attributes-for-set ]
[ static ] member [accessibility-modifier-for-set] [self-identifier.]PropertyName
with set parameter =
set-function-body
// Property that has get only.
[ attributes ]
[ static ] member [accessibility-modifier] [self-identifier.]PropertyName =
get-function-body
// Alternative syntax for property that has get only.
[ attributes ]
[ static ] member [accessibility-modifier] [self-identifier.]PropertyName
with get() =
get-function-body
// Property that has set only.
[ attributes ]
[ static ] member [accessibility-modifier] [self-identifier.]PropertyName
with set parameter =
set-function-body
// Automatically implemented properties.
[attributes ]
[ static ] member val [accessibility-modifier ] PropertyName = initialization-expression [ with get, set ]
Poznámky
Vlastnosti představují "má" vztah v objektově orientovaném programování představující data spojená s instancí objektů nebo pro statické vlastnosti typu.
Vlastnosti dvěma způsoby v závislosti na tom, zda chcete explicitně zadat vlastnosti podkladové hodnoty (nazývané také zálohování úložiště), nebo pokud chcete povolit kompilátor automaticky generovat úložiště zálohování můžete deklarovat.Obecně používejte podrobnější způsobem, pokud má vlastnost-trivial implementace a automatický způsob vlastnost zabaluje stejně jednoduchá hodnota nebo proměnná.Chcete-li explicitně deklarovat vlastnosti, použijte member klíčové slovo.Tato syntaxe deklarativní následuje syntaxe, která určuje, get a set metody také s názvem přístupové objekty.Různé formy syntaxe explicitní syntaxe část slouží pro čtení a zápis vlastnosti pouze pro čtení a zápis pouze pro čtení.Pro vlastnosti určené jen pro čtení, můžete definovat pouze get metoda; jen pro zápis vlastností definovat pouze set metoda.Poznámka: Pokud má vlastnost jak get a set přístupové objekty, alternativní syntaxe umožňuje určit atributy a Modifikátory dostupnosti odlišné pro každý přístupový objekt je znázorněno v následujícím kódu.
// A read-only property.
member this.MyReadOnlyProperty = myInternalValue
// A write-only property.
member this.MyWriteOnlyProperty with set (value) = myInternalValue <- value
// A read-write property.
member this.MyReadWriteProperty
with get () = myInternalValue
and set (value) = myInternalValue <- value
Pro čtení i zápis vlastnosti, které mají oba get a set metoda, pořadí get a set lze stornovat.Alternativně můžete zadat syntaxi zobrazen pro get pouze a jazyka pro set pouze namísto syntaxe kombinované.Tím usnadňuje mimo jednotlivé komentáře get nebo set metody, pokud je to něco potřebujete provést.Tato alternativa k pomocí syntaxe kombinované je zobrazen v následujícím kódu.
member this.MyReadWriteProperty with get () = myInternalValue
member this.MyReadWriteProperty with set (value) = myInternalValue <- value
Soukromé hodnoty obsahující data pro vlastnosti se nazývají zálohování úložiště.Pokud chcete, aby kompilátor automaticky vytvořit úložiště zálohování pomocí klíčových slov member val, vynechat self-identifier a pak zadejte výraz inicializovat vlastnost.Pokud je vlastnost být proměnlivých, with get, set.Například následující typ třídy obsahuje dvě vlastnosti automaticky implementováno. Property1je jen pro čtení a argumentem primární konstruktoru je inicializován a Property2 je nastavitelnou vlastnost inicializován prázdný řetězec:
type MyClass(property1 : int) =
member val Property1 = property1
member val Property2 = "" with get, set
Automaticky implementované vlastnosti jsou inicializaci typu, takže musí být obsažena před jiné definice členské stejně jako let vazby a do v definici typu vazby.Poznámka: výraz, který inicializuje automaticky implementované vlastnost je při inicializaci a není vždy, když je vlastnost je přístupná pouze vyhodnocena.Toto chování je oproti chování výslovně implementované vlastnost.Co to znamená kód inicializace těchto vlastností je přidán do konstruktoru třídy.Zvažte následující kód, který zobrazí tento rozdíl:
type MyClass() =
let random = new System.Random()
member val AutoProperty = random.Next() with get, set
member this.ExplicitProperty = random.Next()
let class1 = new MyClass()
printfn "class1.AutoProperty = %d" class1.AutoProperty
printfn "class1.AutoProperty = %d" class1.AutoProperty
printfn "class1.ExplicitProperty = %d" class1.ExplicitProperty
printfn "class1.ExplicitProperty = %d" class1.ExplicitProperty
Výsledek
Výstup předchozího kódu ukazuje, že hodnota AutoProperty je beze změny při volán opakovaně, že ExplicitProperty změní pokaždé, když se nazývá.Jako metodu getter explicitní vlastnost tento příklad ukazuje výraz pro automaticky implementované vlastnost vyhodnocena není při každém.
Upozornění |
---|
Existují některé knihovny jako Entity Framework (System.Data.Entity), provádějící vlastní operace v základní třídě konstruktory, které nefungují s inicializace automaticky implementovány vlastnosti.V těchto případech použijte explicitní vlastnosti. |
Vlastnosti mohou být členy třídy, struktury, discriminated sdružení, záznamy, rozhraní a typ rozšíření a lze také definovat ve výrazech objektu.
Atributy lze použít vlastnosti.Chcete-li použít vlastnost atributu, psát na samostatný řádek vlastnosti atributu.Další informace naleznete v tématu Atributy (F#).
Standardně jsou veřejné vlastnosti.Modifikátory dostupnosti lze použít také vlastnosti.Chcete-li použít usnadnění modifikátor přidat bezprostředně před název vlastnosti, pokud je určen pro obě get a set metod; Před přidáním get a set klíčová slova, pokud je nutné pro každý přístupový objekt usnadnění různých.The accessibility-modifier can be one of the following: public, private, internal.Další informace naleznete v tématu Řízení přístupu (F#).
Vlastnost implementacemi jsou spouštěny při každém přístupu k vlastnosti.
Statické a vlastností Instance
Vlastnosti mohou být statické nebo vlastnosti instance.Statické vlastnosti lze vyvolat bez instancí a jsou používány pro hodnoty spojené s typem, nikoli s jednotlivými objekty.Statické vlastnosti vynecháte self-identifier.Self-identifier je vyžadována pro vlastnosti instance.
Následující definice statická vlastnost je založena na scénář, ve kterém mají statické pole myStaticValue je zálohování úložiště vlastnosti.
static member MyStaticProperty
with get() = myStaticValue
and set(value) = myStaticValue <- value
Vlastnosti lze také pole podobné v tom případě se nazývají Indexovat vlastnosti.Další informace naleznete v tématu Indexovaných vlastností (F#).
Anotace typu vlastnosti
V mnoha případech kompilátor nemá dostatek informací k odvození typu vlastnosti z typu zálohování úložiště, ale můžete nastavit typ explicitně přidat anotaci typu.
// To apply a type annotation to a property that does not have an explicit
// get or set, apply the type annotation directly to the property.
member this.MyProperty1 : int = myInternalValue
// If there is a get or set, apply the type annotation to the get or set method.
member this.MyProperty2 with get() : int = myInternalValue
Pomocí vlastnosti nastavit přístupové objekty
Můžete nastavit vlastnosti, které poskytují set přístupové objekty pomocí <- operátor.
// Assume that the constructor argument sets the initial value of the
// internal backing store.
let mutable myObject = new MyType(10)
myObject.MyProperty <- 20
printfn "%d" (myObject.MyProperty)
Výstup je 20.
Abstraktní vlastnosti
Vlastnosti mohou být abstraktní.Stejně jako metody, abstraktní pouze znamená, že virtuální odeslání přidružené vlastnosti.Abstraktní vlastnosti lze skutečně abstraktní, bez definice ve stejné třídě.Třída, která obsahuje tato vlastnost je tedy abstraktní třídy.Abstraktní lze také rozumí pouze vlastnost je virtuální, a v takovém případě musí být ve stejné třídě definici.Poznámka: Abstraktní vlastnosti nemusí být soukromé, pokud jeden přístupový objekt je abstraktní, ostatní musí také být abstraktní.Další informace o abstraktní třídy, viz Abstraktní třídy (F#).
// Abstract property in abstract class.
// The property is an int type that has a get and
// set method
[<AbstractClass>]
type AbstractBase() =
abstract Property1 : int with get, set
// Implementation of the abstract property
type Derived1() =
inherit AbstractBase()
let mutable value = 10
override this.Property1 with get() = value and set(v : int) = value <- v
// A type with a "virtual" property.
type Base1() =
let mutable value = 10
abstract Property1 : int with get, set
default this.Property1 with get() = value and set(v : int) = value <- v
// A derived type that overrides the virtual property
type Derived2() =
inherit Base1()
let mutable value2 = 11
override this.Property1 with get() = value2 and set(v) = value2 <- v