Struktúrák
A struktúra olyan kompakt objektumtípus, amely hatékonyabb lehet, mint egy osztály olyan típusok esetében, amelyek kis mennyiségű adatot és egyszerű viselkedést használnak.
Syntax
[ attributes ]
type [accessibility-modifier] type-name =
struct
type-definition-elements-and-members
end
// or
[ attributes ]
[<StructAttribute>]
type [accessibility-modifier] type-name =
type-definition-elements-and-members
Megjegyzések
A struktúrák értéktípusok, ami azt jelenti, hogy közvetlenül a veremen vannak tárolva, vagy ha mezőként vagy tömbelemként használják őket, a szülőtípusba ágyazva. Az osztályoktól és rekordoktól eltérően a struktúrák érték szerinti szemantikával rendelkeznek. Ez azt jelenti, hogy elsősorban a gyakran használt és másolt adatok kis mennyiségű összesítése esetén hasznosak.
Az előző szintaxisban két űrlap jelenik meg. Az első nem az egyszerűsített szintaxis, de mégis gyakran használják, mert a kulcsszavak és end
a struct
kulcsszavak használatakor kihagyhatja az StructAttribute
attribútumot, amely a második formában jelenik meg. Rövidíthet StructAttribute
csak Struct
.
Az előző szintaxisban szereplő típusdefiníciós elemek és tagok tagdeklarációkat és definíciókat jelölnek. A struktúrák lehetnek konstruktorok, mutable és nem módosítható mezők, valamint deklarálhatnak tagokat és interfész-implementációkat. További információ: Tagok.
A struktúrák nem vehetnek részt az öröklésben, nem tartalmazhatnak let
vagy do
kötéseket, és nem tartalmazhatnak rekurzívan saját típusú mezőket (bár tartalmazhatnak saját típusú hivatkozáscellákat).
Mivel a struktúrák nem teszik lehetővé let
a kötéseket, a kulcsszó használatával deklarálnia kell a val
struktúrák mezőit. A val
kulcsszó definiál egy mezőt és annak típusát, de nem teszi lehetővé az inicializálást. Ehelyett a val
deklarációk nullára vagy nullra vannak inicializálva. Ezért az implicit konstruktort (vagyis a deklarációban szereplő struktúra neve után közvetlenül megadott paramétereket) tartalmazó struktúrák megkövetelik, hogy val
a DefaultValue
deklarációk az attribútummal együtt legyenek jegyzetezve. A definiált konstruktort tartalmazó struktúrák továbbra is támogatják a nulla inicializálást. Ezért az DefaultValue
attribútum egy deklaráció, amely szerint egy ilyen nulla érték érvényes a mezőre. A struktúrák implicit konstruktorai nem hajtanak végre semmilyen műveletet, mert let
do
a típus nem engedélyezi a kötéseket, de a megadott implicit konstruktorparaméter-értékek privát mezőként érhetők el.
Az explicit konstruktorok a mezőértékek inicializálását is magukban foglalhatják. Ha explicit konstruktort tartalmazó szerkezettel rendelkezik, az továbbra is támogatja a nulla inicializálást; azonban nem használja az DefaultValue
attribútumot a val
deklarációkban, mert az ütközik a explicit konstruktorral. A deklarációkkal kapcsolatos val
további információkért lásd : Explicit mezők: A val
kulcsszó.
Az attribútumok és az akadálymentességi módosítók a struktúrákon engedélyezettek, és ugyanazokat a szabályokat követik, mint a többi típus esetében. További információ: Attribútumok és hozzáférés-vezérlés.
Az alábbi példakódok a struktúradefiníciókat szemléltetik.
// In Point3D, three immutable values are defined.
// x, y, and z will be initialized to 0.0.
type Point3D =
struct
val x: float
val y: float
val z: float
end
// In Point2D, two immutable values are defined.
// It also has a member which computes a distance between itself and another Point2D.
// Point2D has an explicit constructor.
// You can create zero-initialized instances of Point2D, or you can
// pass in arguments to initialize the values.
type Point2D =
struct
val X: float
val Y: float
new(x: float, y: float) = { X = x; Y = y }
member this.GetDistanceFrom(p: Point2D) =
let dX = (p.X - this.X) ** 2.0
let dY = (p.Y - this.Y) ** 2.0
dX + dY |> sqrt
end
ByRefLike-szerkezetek
Saját, a -like szemantikához byref
igazodó szerkezeteket határozhat meg: további információt a Byrefsben talál. Ez a következő attribútummal IsByRefLikeAttribute történik:
open System
open System.Runtime.CompilerServices
[<IsByRefLike; Struct>]
type S(count1: Span<int>, count2: Span<int>) =
member x.Count1 = count1
member x.Count2 = count2
IsByRefLike
nem azt jelenti , hogy Struct
. Mindkettőnek jelen kell lennie a típuson.
Az F# "byref
-szerű" szerkezete veremhez kötött értéktípus. A rendszer soha nem foglalja le a felügyelt halomra. A byref
-like struct hasznos a nagy teljesítményű programozáshoz, mivel erős ellenőrzésekkel kényszerítik ki az élettartamra és a nem rögzítésre vonatkozóan. A szabályok a következők:
- Használhatók függvényparaméterekként, metódusparaméterekként, helyi változókként, metódusvisszatérésekként.
- Nem lehetnek statikusak vagy példányok tagjai egy osztálynak vagy normál szerkezetnek.
- Nem rögzíthetők lezáró szerkezettel (
async
metódusokkal vagy lambdakifejezésekkel). - Ezek nem használhatók általános paraméterként.
Bár ezek a szabályok nagyon erősen korlátozzák a használatot, azért teszik ezt, hogy biztonságosan teljesítsék a nagy teljesítményű számítástechnika ígéretét.
ReadOnly-szerkezetek
Az attribútummal megjegyzéseket fűzhet a IsReadOnlyAttribute szerkezetekhez. Példa:
[<IsReadOnly; Struct>]
type S(count1: int, count2: int) =
member x.Count1 = count1
member x.Count2 = count2
IsReadOnly
nem azt jelenti , hogy Struct
. A szerkezet létrehozásához IsReadOnly
mindkettőt hozzá kell adnia.
Ennek az attribútumnak a használata metaadatokat bocsát ki, így az F# és a C# tudni fogja, hogy inref<'T>
a metaadatot és in ref
a megfelelőt kezelje.
Ha egy olvasható szerkezeten belül egy mutable értéket határoz meg, hiba keletkezik.
Nyilvántartások és diszkriminált szakszervezetek strukturálása
A Rekordokat és a Diszkriminált Uniókat az attribútummal együtt strukturáltként [<Struct>]
is képviselheti. További információért tekintse meg az egyes cikkeket.