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 Struct
olarak 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 let
do
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 byref
uyabilecek 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 Struct
gelmez. Her ikisi de türünde bulunmalıdır.
F# dilindeki "byref
benzer" yapı, yığına bağlı bir değer türüdür. Yönetilen yığında hiçbir zaman ayrılmaz. byref
Benzer 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 Struct
gelmez. 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 ref
olarak 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.