let Bindings in Classes
Du kan definiera privata fält och privata funktioner för F#-klasser med hjälp let
av bindningar i klassdefinitionen.
Syntax
// Field.
[static] let [ mutable ] binding1 [ and ... binding-n ]
// Function.
[static] let [ rec ] binding1 [ and ... binding-n ]
Kommentarer
Den tidigare syntaxen visas efter klassrubriken och arvsdeklarationerna men före eventuella medlemsdefinitioner. Syntaxen liknar let
bindningar utanför klasser, men namnen som definieras i en klass har ett omfång som är begränsat till klassen. En let
bindning skapar ett privat fält eller en funktion. För att exponera data eller funktioner offentligt deklarerar du en egenskap eller en medlemsmetod.
En let
bindning som inte är statisk kallas en instansbindning let
. Instansbindningar let
körs när objekt skapas. Statiska let
bindningar är en del av den statiska initiatorn för klassen, som garanterat körs innan typen först används.
Koden i instansbindningar let
kan använda den primära konstruktorns parametrar.
Attribut och hjälpmedelsmodifierare tillåts inte för let
bindningar i klasser.
Följande kodexempel illustrerar flera typer av let
bindningar i klasser.
type PointWithCounter(a: int, b: int) =
// A variable i.
let mutable i = 0
// A let binding that uses a pattern.
let (x, y) = (a, b)
// A private function binding.
let privateFunction x y = x * x + 2 * y
// A static let binding.
static let mutable count = 0
// A do binding.
do count <- count + 1
member this.Prop1 = x
member this.Prop2 = y
member this.CreatedCount = count
member this.FunctionValue = privateFunction x y
let point1 = PointWithCounter(10, 52)
printfn "%d %d %d %d" (point1.Prop1) (point1.Prop2) (point1.CreatedCount) (point1.FunctionValue)
Utdata är följande.
10 52 1 204
Alternativa sätt att skapa fält
Du kan också använda nyckelordet val
för att skapa ett privat fält. När du använder nyckelordet val
får fältet inte något värde när objektet skapas, utan initieras i stället med ett standardvärde. Mer information finns i Explicita fält: Val-nyckelordet.
Du kan också definiera privata fält i en klass med hjälp av en medlemsdefinition och lägga till nyckelordet private
i definitionen. Detta kan vara användbart om du förväntar dig att ändra tillgängligheten för en medlem utan att skriva om koden. Mer information finns i Åtkomstkontroll.