Pola jawne: val — Słowo kluczowe (F#)
val Zostanie użyte słowo kluczowe zadeklarować pole typu klasy lub struktury bez jego inicjowania.Nazywane są zadeklarowane w ten sposób pola pól jawne.Innym zastosowaniem val jest słowo kluczowe w połączeniu z member słowo kluczowe, aby zadeklarować właściwości auto wdrożone.Więcej informacji na temat właściwości wykonywane automatycznie, zobacz Właściwości (F#).
val [ mutable ] [ access-modifier ] field-name : type-name
Uwagi
Tradycyjny sposób definiowania pól typu klasy lub struktury jest użycie let powiązania.Jednakże let wiązania musi być zainicjowany jako część konstruktora klasy, nie zawsze jest możliwe, niezbędne lub pożądane.Można użyć val słowa kluczowego, należy pole, które jest niezainicjowana.
Jawne pól mogą być statyczne lub -statycznej.The access-modifier can be public, private, or internal.Domyślnie pola jawne są publiczne.To różni się od let powiązania klas, które są zawsze prywatne.
DefaultValue atrybut jest wymagany na polach jawnych typów klasy podstawowej konstruktora.Ten atrybut określa zainicjowanej pola na zero.Typ pola musi obsługiwać inicjowania zero.Typu obsługuje inicjowania zero, jeśli jest jedną z następujących:
Pierwotny typ ma wartość zero.
Typ, który obsługuje wartość null jako wartości normalnej, jako nieprawidłowej wartości albo jako reprezentacja wartości.Obejmuje to klas, krotek, rekordy, funkcje, interfejsy, typy odwołań .net, unit typu i dyskryminowanych typów Unii.
Typ wartości .net.
Struktura, w których wszystkie pola obsługuje domyślną wartość zero.
Przestroga |
---|
Uwaga obszaru nazw.NET Framework System.ComponentModel zawiera atrybut, który ma taką samą nazwę.Informacje dla tego atrybutu, zobacz DefaultValueAttribute. |
Poniższy kod ilustruje użycie pól jawne i dla porównania, let wiązania w klasie z podstawowego konstruktora.Należy zauważyć, że let-pole związane myInt1 jest prywatna.Gdy let-pole związane myInt1 jest wywoływany przez metodę Członkowskie self identyfikator this nie jest wymagane.Ale gdy odwołujesz jawne pól myInt2 i myString, self identyfikator jest wymagany.
type MyType() =
let mutable myInt1 = 10
[<DefaultValue>] val mutable myInt2 : int
[<DefaultValue>] val mutable myString : string
member this.SetValsAndPrint( i: int, str: string) =
myInt1 <- i
this.myInt2 <- i + 1
this.myString <- str
printfn "%d %d %s" myInt1 (this.myInt2) (this.myString)
let myObject = new MyType()
myObject.SetValsAndPrint(11, "abc")
// The following line is not allowed because let bindings are private.
// myObject.myInt1 <- 20
myObject.myInt2 <- 30
myObject.myString <- "def"
printfn "%d %s" (myObject.myInt2) (myObject.myString)
Wynik jest następujący:
11 12 abc
30 def
Poniższy kod przedstawia jawne pola w klasie, która nie ma konstruktora podstawowego.W przypadku DefaultValue atrybut nie jest wymagane, ale wszystkie pola muszą być inicjowane w konstruktory, które są zdefiniowane dla typu.
type MyClass =
val a : int
val b : int
// The following version of the constructor is an error
// because b is not initialized.
// new (a0, b0) = { a = a0; }
// The following version is acceptable because all fields are initialized.
new(a0, b0) = { a = a0; b = b0; }
let myClassObj = new MyClass(35, 22)
printfn "%d %d" (myClassObj.a) (myClassObj.b)
Dane wyjściowe są 35 22.
Poniższy kod przedstawia jawne pola w strukturze.Ponieważ struktura jest typ wartości, automatycznie ma domyślnego konstruktora, który ustawia wartości pól na zero.Dlatego DefaultValue atrybut nie jest wymagane.
type MyStruct =
struct
val mutable myInt : int
val mutable myString : string
end
let mutable myStructObj = new MyStruct()
myStructObj.myInt <- 11
myStructObj.myString <- "xyz"
printfn "%d %s" (myStructObj.myInt) (myStructObj.myString)
Dane wyjściowe są 11 xyz.
Jawne pól nie są przeznaczone do rutynowego stosowania.Ogólnie, gdy to możliwe należy używać let wiązania w klasie zamiast jawnego pola.Jawne pól są przydatne w pewnych scenariuszach interoperacyjności, jak potrzebne do definiowania struktury, która będzie używana w platformie Wywołaj wywołanie API macierzystym lub w scenariuszach międzyoperacyjnego COM.Aby uzyskać więcej informacji, zobacz Funkcje zewnętrzne (F#).Innej sytuacji, w których może być konieczne jawne pola jest podczas pracy F# generator kodu który emituje klas bez konstruktora podstawowego.Jawne pól są także przydatne do wątku statyczne zmienne lub podobnych konstrukcji.Aby uzyskać więcej informacji, zobacz ThreadStaticAttribute.
Gdy słowa kluczowe member val są wyświetlane razem w definicji typu jest definicja automatycznie wdrażane właściwości.Aby uzyskać więcej informacji, zobacz Właściwości (F#).