Właściwości (F#)

Właściwości są członkami, które reprezentują wartości skojarzonych z obiektem.

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

Uwagi

Reprezentuje właściwości "ma" relacji, w programowaniu obiektowym, reprezentujący dane skojarzone wystąpienia obiektów lub, w przypadku właściwości statyczne z typem.

Można zadeklarować właściwości na dwa sposoby, w zależności od tego, czy chcesz jawnie określić wartości podstawowej (nazywane również kopią) dla właściwości lub jeśli chcesz zezwolić kompilator automatycznie wygenerować kopią użytkownik.Ogólnie należy użyć bardziej jednoznaczny sposób, jeśli właściwość ma skomplikowanych wykonania i w sposób automatyczny, gdy właściwość jest tylko proste otoki dla wartości lub zmiennej.Aby jawnie deklarować właściwości, użyj member słowa kluczowego.Ta składnia deklaracyjne następuje składni, która określa get i set metod, również o nazwie akcesorów.Różne formy składni jawne pokazano w sekcji Składnia są używane do odczytu i zapisu, właściwości tylko do odczytu i zapisu tylko do odczytu.Dla właściwości tylko do odczytu, można zdefiniować tylko get metody; dla właściwości tylko do zapisu tylko zdefiniować set metody.Należy zauważyć, że kiedy właściwość ma zarówno get i set akcesory, alternatywne składni można określić atrybuty i modyfikatorów ułatwień dostępu, które są różne dla każdego akcesor przedstawiony w poniższym kodzie.

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

Dla właściwości do odczytu i zapisu, które zarówno get i set metody, kolejność get i set można cofnąć.Alternatywnie, można zapewnić składnia dla get jedynie i składnię, dla set tylko zamiast przy użyciu składni Scalonej.W ten sposób ułatwia w komentarze poszczególnych get lub set metodę, jeżeli jest to coś należy wykonać.Zamiast tej składni Scalonej przedstawiono w poniższym kodzie.

member this.MyReadWriteProperty with get () = myInternalValue
member this.MyReadWriteProperty with set (value) = myInternalValue <- value

Prywatne wartości, które posiadają właściwości danych są nazywane kopii sklepy.Aby kompilator automatycznie utworzyć magazynu, należy użyć słowa kluczowe member val, pominąć self-identifier, a następnie podać wyrażenie zainicjować właściwość.Jeśli właściwość ma być tych, with get, set.Na przykład następujący typ klasy zawiera dwie właściwości automatycznie implementowane. Property1jest tylko do odczytu i inicjowana jest argument do konstruktora podstawowego i Property2 jest do ustawienia właściwości, można zainicjować pusty ciąg:

type MyClass(property1 : int) =
    member val Property1 = property1
    member val Property2 = "" with get, set

Właściwości automatycznie wdrażane są częścią inicjowania typu, więc muszą być uwzględnione przed inne definicje Członkowskich, podobnie jak let powiązania i do wiązania w definicji typu.Uwaga wyrażenie inicjuje automatycznie wdrażane właściwości tylko jest oceniane po zainicjowaniu, a nie przy każdym dostępu do właściwości.To zachowanie jest w przeciwieństwie do zachowania jawnie wdrażane właściwości.Skutecznie oznacza to że kod zainicjować tych właściwości jest dodawany do konstruktora klasy.Rozważmy następujący kod, który pokazuje różnicę:

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

Dane wyjściowe

  

Dane wyjściowe poprzedniego kodu pokazuje, że wartość AutoProperty jest bez zmian po wywołaniu wielokrotnie, ExplicitProperty zmienia się każdorazowo zostanie wywołana.Pokazuje to, że wyrażenie automatycznie wdrażane właściwości nie jest sprawdzane przy każdym jest metoda pobierająca jawne właściwości.

Informacje dotyczące przestrogiPrzestroga

Brak niektórych bibliotek, takich jak Entity Framework (System.Data.Entity), niestandardowe operacje konstruktorów klas podstawowych, które nie działają dobrze inicjowania automatycznie implementowane właściwości.W tych przypadkach spróbuj jawne właściwości.

Właściwości mogą być członkami klasy, struktury, dyskryminowanych związków, rekordy, interfejsów i rozszerzenia typu i można także zdefiniować w wyrażeniach obiektu.

Atrybuty mogą być stosowane do właściwości.Aby zastosować atrybut do właściwości, Zapisywanie atrybutu w osobnym wierszu, zanim właściwość.Aby uzyskać więcej informacji, zobacz Atrybuty (F#).

Domyślnie właściwości są publiczne.Modyfikatorów ułatwień dostępu można również zastosować do właściwości.Aby zastosować modyfikator ułatwień dostępu, dodać bezpośrednio przed nazwę właściwości, jeśli ma to zastosowanie zarówno get i set metod; dodać go przed get i set słowa kluczowe, jeżeli różnych ułatwień dostępu jest wymagana dla każdego typu accessor.The accessibility-modifier can be one of the following: public, private, internal.Aby uzyskać więcej informacji, zobacz Kontrola dostępu (F#).

Właściwość implementacje wykonywane są każdorazowo dostępu do właściwości.

Statyczne i właściwości instancji

Właściwości mogą być statyczne lub właściwości instancji.Właściwości statyczne można wywołać bez wystąpienia i są używane dla wartości skojarzone z typem, a nie z poszczególnych obiektów.Właściwości statyczne można pominąć w self-identifier.Self-identifier jest wymagany dla właściwości instancji.

Następującą definicję właściwości statycznej opiera się na scenariusz, w którym użytkownik ma pola statycznego myStaticValue czyli magazynu właściwości.

static member MyStaticProperty
    with get() = myStaticValue
    and set(value) = myStaticValue <- value

Właściwości można także-podobny, w którym to przypadku są nazywane Właściwości indeksowane.Aby uzyskać więcej informacji, zobacz Właściwości indeksowane (F#).

Wskazanie typu właściwości

W wielu przypadkach kompilator ma wystarczająco dużo informacji, aby ustalić typ właściwości typu magazynu, ale można ustawić typ jawnie przez dodanie adnotacji 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

Za pomocą właściwości ustaw akcesorów

Można ustawić właściwości, które dostarczają set akcesorów za pomocą <- operatora.

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

Dane wyjściowe są 20.

Właściwości

Właściwości mogą być abstrakcyjne.Podobnie jak w przypadku metody, abstrakcyjna oznacza jest wirtualny wysyłki, skojarzony z właściwością.Właściwości może być naprawdę abstrakcyjny, czyli bez definicji w tej samej klasie.Klasa, która zawiera takie właściwości, dlatego jest klasą abstrakcyjną.Alternatywnie streszczenie tylko może oznaczać, że właściwość jest wirtualna, i w takim przypadku definicji musi być obecny w tej samej klasie.Należy zauważyć, że właściwości abstrakcyjna nie może być prywatny i jeśli jeden akcesor jest abstrakcyjna, drugiej musi również być abstrakcyjne.Aby uzyskać więcej informacji na temat klasy abstrakcyjne, zobacz Klasy abstrakcyjne (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

Zobacz też

Informacje

Metody (F#)

Inne zasoby

Członkowie (F#)