Megosztás a következőn keresztül:


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 letdo 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 byrefigazodó 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 refa 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.

Lásd még