Yapılar

Yapı, az miktarda veriye ve basit davranışa sahip türler için bir sınıftan daha verimli olabilecek kompakt bir nesne türüdür.

Sözdizimi

[ 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

Açıklamalar

Yapılar değer türleridir; bu da doğrudan yığında depolandığı veya alan veya dizi öğesi olarak kullanıldığında üst tür içinde satır içi olarak depolandığı anlamına gelir. Sınıfların ve kayıtların aksine, yapıların değere göre geçiş semantiği vardır. Bu, öncelikle sık erişilen ve kopyalanan küçük veri toplamaları için yararlı oldukları anlamına gelir.

Önceki söz diziminde iki form gösterilir. birincisi basit söz dizimi değildir, ancak yine de sık kullanılır çünkü ve end anahtar sözcüklerini kullandığınızdastruct, ikinci biçimde görünen özniteliği atlayabilirsinizStructAttribute. yalnızca Structolarak StructAttribute kısaltabilirsiniz.

Önceki söz dizimindeki type-definition-elements-and-members, üye bildirimlerini ve tanımlarını temsil eder. Yapıların oluşturucuları, değiştirilebilir ve sabit alanları olabilir ve üyeleri ve arabirim uygulamalarını bildirebilirler. Daha fazla bilgi için bkz . Üyeler.

Yapılar devralma işlemine katılamaz, bağlama içeremez let ve do özyinelemeli olarak kendi türünde alanlar içeremez (ancak kendi türlerine başvuran başvuru hücreleri içerebilirler).

Yapılar bağlamalara izin let vermediğinden, anahtar sözcüğünü val kullanarak yapılardaki alanları bildirmeniz gerekir. val anahtar sözcüğü bir alanı ve türünü tanımlar ancak başlatmaya izin vermez. Bunun yerine, val bildirimler sıfır veya null olarak başlatılır. Bu nedenle örtük bir oluşturucuya (yani bildirimdeki yapı adından hemen sonra verilen parametrelere) sahip yapılar, bildirimlerin val özniteliğiyle ek açıklama eklemesini DefaultValue gerektirir. Tanımlı bir oluşturucuya sahip yapılar sıfır başlatmayı desteklemeye devam eder. Bu nedenle, DefaultValue özniteliği bu tür bir sıfır değerinin alan için geçerli olduğunu belirten bir bildirimdir. Yapılara yönelik örtük oluşturucular, tür üzerinde bağlamalara izin verilmediğinden herhangi bir eylem letdo gerçekleştirmez, ancak geçirilen örtük oluşturucu parametre değerleri özel alanlar olarak kullanılabilir.

Açık oluşturucular alan değerlerinin başlatılmasını içerebilir. Açık bir oluşturucuya sahip bir yapınız varsa, yine de sıfır başlatmayı destekler; ancak, açık oluşturucu ile çakıyor çünkü bildirimlerinde özniteliğini val kullanmazsınızDefaultValue. Bildirimler hakkında val daha fazla bilgi için bkz . Açık Alanlar: Anahtar val Sözcük.

Yapılarda özniteliklere ve erişilebilirlik değiştiricilerine izin verilir ve diğer türlerle aynı kurallara uyun. Daha fazla bilgi için bkz . Öznitelikler ve Erişim Denetimi.

Aşağıdaki kod örneklerinde yapı tanımları gösterilmektedir.

// 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 yapıları

Benzer semantiklere byrefuyabilecek kendi yapılarınızı tanımlayabilirsiniz: Daha fazla bilgi için bkz . Byrefs . Bu işlem şu öznitelikle IsByRefLikeAttribute yapılır:

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 anlamına Structgelmez. Her ikisi de türünde bulunmalıdır.

F# dilindeki "byrefbenzer" yapı, yığına bağlı bir değer türüdür. Yönetilen yığında hiçbir zaman ayrılmaz. byrefBenzer bir yapı, yüksek performanslı programlama için kullanışlıdır, yaşam süresi ve yakalama olmayanlar hakkında güçlü denetimler kümesiyle zorunlu kılınır. Kurallar şunlardır:

  • İşlev parametreleri, yöntem parametreleri, yerel değişkenler, yöntem dönüşleri olarak kullanılabilirler.
  • Statik veya bir sınıfın veya normal yapının örnek üyeleri olamazlar.
  • Bunlar herhangi bir kapatma yapısı (async yöntemler veya lambda ifadeleri) tarafından yakalanamaz.
  • Genel parametre olarak kullanılamazlar.

Bu kurallar kullanımı çok güçlü bir şekilde kısıtlasa da, yüksek performanslı bilgi işlem sözünü güvenli bir şekilde yerine getirmek için bunu yapar.

ReadOnly yapıları

Öznitelik ile IsReadOnlyAttribute yapılara açıklama ekleyebilirsiniz. Örneğin:

[<IsReadOnly; Struct>]
type S(count1: int, count2: int) =
    member x.Count1 = count1
    member x.Count2 = count2

IsReadOnly anlamına Structgelmez. Yapıya sahip IsReadOnly olmak için her ikisini de eklemeniz gerekir.

Bu özniteliğin kullanılması, F# ve C# tarafından sırasıyla ve in refolarak inref<'T> ele alınıp alınamayan meta verileri yayar.

Salt okunur bir yapının içinde değiştirilebilir bir değer tanımlamak hataya neden olur.

Yapı Kayıtları ve Ayrımcı Birleşimler

Kayıtları ve Ayrımcı Birleşimleri özniteliğiyle [<Struct>] yapı olarak temsil edebilirsiniz. Daha fazla bilgi edinmek için her makaleye bakın.

Ayrıca bkz.