Sdílet prostřednictvím


Explicitní pole: Klíčové slovo val (F#)

val Klíčové slovo lze deklarovat pole v typu třídy nebo struktury bez jeho inicializaci.Pole deklarované tímto způsobem se nazývají explicitní polí.Použití jiného val klíčové slovo je ve spojení s member klíčové slovo automaticky implementovat vlastnost deklarovat.Další informace o vlastnosti automaticky implementovány viz Vlastnosti (F#).

 val [ mutable ] [ access-modifier ] field-name : type-name

Poznámky

Definujte pole v typu třídy nebo struktury obvyklým způsobem je použití let vazby.Však let vazby musí být inicializována v rámci konstruktoru třídy, které není vždy možné, nezbytné nebo žádoucí.Můžete použít val klíčové slovo, pokud chcete, aby pole, které není inicializována.

Explicitní polí mohou být statické nebo nestatický.The access-modifier can be public, private, or internal.Explicitní pole ve výchozím nastavení jsou veřejné.Tím se liší od let vazby třídy, které jsou vždy soukromé.

DefaultValue na polích explicitní typy tříd, jejichž primární konstruktoru je vyžadován atribut.Tento atribut určuje inicializuje pole nula.Typ pole musí podporovat inicializace nula.Typ podporuje inicializaci nula, pokud je jeden z následujících:

  • Primitivní typ, který má hodnotu nula.

  • Typ, který podporuje hodnotu null, buď jako normální hodnota, jako abnormální hodnoty nebo jako reprezentace hodnotu.Zahrnuje třídy n-tic, záznamů, funkce, rozhraní, rozhraní referenční typy unit discriminated unie typy a typu.

  • Typ hodnoty .net.

  • Struktura, jejíž všechna pole podporují výchozí nulovou hodnotu.

Poznámka k upozorněníUpozornění

Poznámka: oboru názvů rozhraní.NET Framework System.ComponentModel obsahuje atribut, který má stejný název.Informace o tomto atributu DefaultValueAttribute.

Následující kód ukazuje použití explicitní polí a pro srovnání let vazby ve třídě, která má primární konstruktor.Všimněte si, že let-vázané pole myInt1 soukromý.Při let-vázané pole myInt1 z členů metody, vlastní identifikátor odkazuje this není vyžadováno.Ale když odkazujete explicitní polí myInt2 a myString, self identifikátor je vyžadován.

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)

Výstup je následující:

11 12 abc

30 def

Následující kód ukazuje použití explicitní polí ve třídě, která nemá primární konstruktor.V tomto případě DefaultValue atributu není vyžadováno, ale musí být všechna pole inicializována v konstruktory, které jsou definovány pro typ.

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)

Výstup je 35 22.

Následující kód ukazuje použití explicitní polí ve struktuře.Struktura je typ hodnoty, má automaticky výchozí konstruktor, který nastavuje hodnoty polí na nulu.Proto DefaultValue atributu není vyžadováno.

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)

Výstup je 11 xyz.

Explicitní polí nejsou určeny pro běžné použití.Obecně platí, pokud možno používejte let vazby třídy místo explicitní pole.Explicitní pole jsou užitečné v určitých scénářích interoperability, například můžete definovat strukturu, která bude použita v platformu vyvolat volání nativní rozhraní API nebo COM interop scénářů.Další informace naleznete v tématu Externí funkce (F#).Jiné situace, ve které může být nezbytné explicitní pole je při práci s F# Generátor kódu, které vyzařuje bez primárního konstruktoru třídy.Explicitní pole jsou také užitečné pro podproces statické proměnné nebo podobné konstrukce.Další informace naleznete v tématu ThreadStaticAttribute.

Když klíčová slova member val se zobrazí společně v definici typu definice, automaticky implementované vlastnosti je.Další informace naleznete v tématu Vlastnosti (F#).

Viz také

Referenční dokumentace

Vlastnosti (F#)

Vazby let ve třídách (F#)

Další zdroje

Členy (F#)