Aracılığıyla paylaş


Kayıtları (F#)

Basit aggregates üyeleri ile isteğe bağlı olarak adlandırılmış değerleri temsil eder.

[ attributes ]
type [accessibility-modifier] typename = { 
    [ mutable ] label1 : type1;
    [ mutable ] label2 : type2;
    ...
    }
    member-list

Notlar

Önceki sözdiziminde typename kayıt türü adı label1 ve label2 olarak adlandırılan değerlerin adları etiketleri, ve type1 ve type2 bu değerlerin türleri şunlardır. member-listİsteğe bağlı üye türü listesidir.

Bazı örnekler aşağıda verilmektedir.

type Point = { x : float; y: float; z: float; }
type Customer = { First : string; Last: string; SSN: uint32; AccountNumber : uint32; }

Her etiketin ayrı bir satırda, noktalı isteğe bağlıdır.

İfadelerde olarak bilinen değerlerini ayarlamak kaydı ifadeler. Derleyici (etiketleri yeteri kadar olanlar diğer kayıt türleri farklıdır) kullanılan etiketler türünden yorumlar. Kayıt ifade kaşlı ayraç ({}) içine. Aşağıdaki kod üç float öğe etiketleriyle kaydıyla başlatan kayıt ifade gösterir x, y ve z.

let mypoint = { x = 1.0; y = 1.0; z = -1.0; }

Kısaltılmış olabilir, ayrıca aynı etikete sahip başka bir tür kullanmayın.

type Point = { x : float; y: float; z: float; }
type Point3D = { x: float; y: float; z: float }
// Ambiguity: Point or Point3D?
let mypoint3D = { x = 1.0; y = 1.0; z = 0.0; }

En son bildirilen türü etiketleri olanlar daha önce bildirilen türü öncelikli önceki örnekte bunu mypoint3D olarak algılanır Point3D. Aşağıdaki kodda olduğu gibi kayıt türünü açıkça belirtebilirsiniz.

let myPoint1 = { Point.x = 1.0; y = 1.0; z = 0.0; }

Yöntem yalnızca olarak sınıf türleri için kayıt türleri için tanımlanabilir.

Kayıtlar, kayıt ifadeler kullanarak oluşturma

Kayıtta tanımlı etiketleri kullanarak kayıtları başlatabilir. Bunu yapan bir ifade olarak başvurulan bir kaydı ifade. Kayıt deyimi alın ve ayırıcı olarak noktalı virgül kullanmanız için ayraçları kullanın.

Aşağıdaki örnek bir kayıt oluşturulması gösterilmiştir.

type MyRecord = {
    X: int;
    Y: int;
    Z: int 
    }

let myRecord1 = { X = 1; Y = 2; Z = 3; }

Son kayıt ifadesinde ve tür tanımı alanından sonra noktalı alanların tümü tek bir satırda olan ne olursa olsun, seçmelidir.

Bir kayıt oluşturduğunuzda, her alan için bir değer sağlamalısınız. Başlatma ifade herhangi bir alan için diğer alanlarındaki değerlere başvuruda bulunamaz.

Aşağıdaki kodda, bir tür myRecord2 alan adlarından algılanır. İsteğe bağlı olarak, tür adı açıkça belirtebilirsiniz.

let myRecord2 = { MyRecord.X = 1; MyRecord.Y = 2; MyRecord.Z = 3 }

Varolan bir kaydı kopyalayın ve büyük olasılıkla bazı alan değerlerini değiştirmek zorunda başka bir forma kayıt zarlı yararlı olabilir. Aşağıdaki kod satırı bunu göstermektedir.

let myRecord3 = { myRecord2 with Y = 100; Z = 2 }

Kayıt ifade bu form adı verilen kopyalayın ve güncelleştirme kaydı ifade.

Varsayılan olarak, kayıtları sabittir; Ancak, kopya ve update deyimi kullanarak değiştirilen kayıtları kolayca oluşturabilirsiniz. Ayrıca açıkça kesilebilir bir alan belirtebilirsiniz.

type Car = {
    Make : string
    Model : string
    mutable Odometer : int
    }
let myCar = { Make = "Fabrikam"; Model = "Coupe"; Odometer = 108112 }
myCar.Odometer <- myCar.Odometer + 21

DefaultValue özniteliği ile kayıt alanı kullanmayın. Daha iyi bir yaklaşım, varsayılan örneği başlatılır alanlar içeren kayıtlar için varsayılan değerleri tanımlamak bir kopyasını kullanan ve varsayılan değerlerden farklı alanları belirlemek için kayıt ifade güncelleştirme sağlamaktır.

// Rather than use [<DefaultValue>], define a default record.
type MyRecord =
    { 
        field1 : int 
        field2 : int
    }

let defaultRecord1 = { field1 = 0; field2 = 0 }
let defaultRecord2 = { field1 = 1; field2 = 25 }

// Use the with keyword to populate only a few chosen fields
// and leave the rest with default values.
let rr3 = { defaultRecord1 with field2 = 42 }

Desen eşleştirme kayıtları

Kayıtlar, desen eşleştirme ile kullanılabilir. Bazı alanlar açıkça belirtin ve bir eşleşme gerçekleştiğinde atanacak diğer alanlar için değişkenleri sağlar. Aşağıdaki kod örneği, bunu göstermektedir.

type Point3D = { x: float; y: float; z: float }
let evaluatePoint (point: Point3D) =
    match point with
    | { x = 0.0; y = 0.0; z = 0.0 } -> printfn "Point is at the origin."
    | { x = xVal; y = 0.0; z = 0.0 } -> printfn "Point is on the x-axis. Value is %f." xVal
    | { x = 0.0; y = yVal; z = 0.0 } -> printfn "Point is on the y-axis. Value is %f." yVal
    | { x = 0.0; y = 0.0; z = zVal } -> printfn "Point is on the z-axis. Value is %f." zVal
    | { x = xVal; y = yVal; z = zVal } -> printfn "Point is at (%f, %f, %f)." xVal yVal zVal

evaluatePoint { x = 0.0; y = 0.0; z = 0.0 }
evaluatePoint { x = 100.0; y = 0.0; z = 0.0 }
evaluatePoint { x = 10.0; y = 0.0; z = -1.0 }

Bu programýn çýktýsý aþaðýdaki gibidir.

Point is at the origin.
Point is on the x-axis. Value is 100.000000.
Point is at (10.000000, 0.000000, -1.000000).

Kayıtları ve sınıflar arasındaki farklar

Kayıt alanları sınıflardan gibi özellikleri otomatik olarak sunulur ve oluştururken kullanılan ve kopyalama kayıt olmaları bakımından farklılık gösterir. Kayıt yapım, sınıf yapım farklılık gösterir. Kayıt türü bir kurucu tanımlayamazsınız. Bunun yerine, bu konuda açıklanan yapım sözdizimi geçerlidir. Yapıcı parametreleri, alanlar ve özellikler arasında doğrudan hiçbir ilişki sınıfları içerir.

UNION ve yapı gibi kayıtları yapısal eşitlik mantığı vardır. Sınıflar başvuru olan eşitlik mantığı. Aşağıdaki kod örneği, bu gösterir.

type RecordTest = { X: int; Y: int }
let record1 = { X = 1; Y = 2 }
let record2 = { X = 1; Y = 2 }
if (record1 = record2) then
    printfn "The records are equal."
else
    printfn "The records are unequal."

Sınıfları ile aynı kod yazma, iki sınıf nesneleri iki değer öbek üzerindeki iki nesne temsil eder ve adreslerinin karşılaştırılması için eşit olacaktır (sınıf türü geçersiz kılar sürece System.Object.Equals yöntemi).

Ayrıca bkz.

Başvuru

Sınıflar (F#)

Desen eşleştirme (F#)

Diğer Kaynaklar

F# türleri

F# dil başvurusu