Bagikan melalui


Struktur

Struktur adalah jenis objek ringkas yang bisa lebih efisien daripada kelas untuk jenis yang memiliki sejumlah kecil data dan perilaku sederhana.

Sintaksis

[ 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

Komentar

Struktur adalah jenis nilai, yang berarti bahwa mereka disimpan langsung di tumpukan atau, ketika digunakan sebagai bidang atau elemen array, sebaris dalam jenis induk. Tidak seperti kelas dan rekaman, struktur memiliki semantik pass-by-value. Ini berarti bahwa data tersebut berguna terutama untuk agregat kecil data yang sering diakses dan disalin.

Dalam sintaks sebelumnya, dua formulir diperlihatkan. Yang pertama bukan sintaks ringan, tetapi tetap sering digunakan karena, ketika Anda menggunakan struct kata kunci dan end , Anda dapat menghilangkan StructAttribute atribut , yang muncul dalam bentuk kedua. Anda dapat singkatan StructAttribute hanya Structuntuk .

Type-definition-elements-and-members dalam sintaks sebelumnya mewakili deklarasi dan definisi anggota. Struktur dapat memiliki konstruktor dan bidang yang dapat diubah dan tidak dapat diubah, dan mereka dapat mendeklarasikan anggota dan implementasi antarmuka. Untuk informasi selengkapnya, lihat Anggota.

Struktur tidak dapat berpartisipasi dalam pewarisan, tidak dapat berisi let atau do mengikat, dan tidak dapat secara rekursif berisi bidang dengan jenisnya sendiri (meskipun dapat berisi sel referensi yang mereferensikan jenisnya sendiri).

Karena struktur tidak mengizinkan let pengikatan, Anda harus mendeklarasikan bidang dalam struktur dengan menggunakan val kata kunci. Kata val kunci mendefinisikan bidang dan jenisnya tetapi tidak mengizinkan inisialisasi. Sebaliknya, val deklarasi diinisialisasi ke nol atau null. Untuk alasan ini, struktur yang memiliki konstruktor implisit (yaitu, parameter yang diberikan segera setelah nama struktur dalam deklarasi) mengharuskan val deklarasi dianotasikan dengan DefaultValue atribut . Struktur yang memiliki konstruktor yang ditentukan masih mendukung inisialisasi nol. Oleh karena itu, DefaultValue atribut adalah deklarasi bahwa nilai nol tersebut valid untuk bidang . Konstruktor implisit untuk struktur tidak melakukan tindakan apa pun karena let dan do pengikatan tidak diizinkan pada jenis, tetapi nilai parameter konstruktor implisit yang diteruskan tersedia sebagai bidang privat.

Konstruktor eksplisit mungkin melibatkan inisialisasi nilai bidang. Ketika Anda memiliki struktur yang memiliki konstruktor eksplisit, struktur tersebut masih mendukung inisialisasi nol; namun, Anda tidak menggunakan DefaultValue atribut pada val deklarasi karena bertentangan dengan konstruktor eksplisit. Untuk informasi selengkapnya tentang val deklarasi, lihat Bidang Eksplisit: Kata val Kunci.

Pengubah atribut dan aksesibilitas diizinkan pada struktur, dan mengikuti aturan yang sama dengan yang untuk jenis lain. Untuk informasi selengkapnya, lihat Atribut dan Kontrol Akses.

Contoh kode berikut mengilustrasikan definisi struktur.

// 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

Struktur ByRefLike

Anda dapat menentukan struktur Anda sendiri yang dapat mematuhi byrefsemantik -seperti: lihat Byrefs untuk informasi selengkapnya. Ini dilakukan dengan atribut IsByRefLikeAttribute:

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 tidak menyiratkan Struct. Keduanya harus ada pada jenis .

Struktur "byrefseperti" di F# adalah jenis nilai yang terikat tumpukan. Ini tidak pernah dialokasikan pada tumpukan terkelola. Struktur byrefseperti ini berguna untuk pemrograman berkinerja tinggi, karena diberlakukan dengan serangkaian pemeriksaan yang kuat tentang masa pakai dan non-pengambilan. Aturannya adalah:

  • Mereka dapat digunakan sebagai parameter fungsi, parameter metode, variabel lokal, pengembalian metode.
  • Mereka tidak boleh menjadi anggota statis atau instans kelas atau struktur normal.
  • Mereka tidak dapat ditangkap oleh konstruksi penutupan apa pun (async metode atau ekspresi lambda).
  • Mereka tidak dapat digunakan sebagai parameter generik.

Meskipun aturan ini sangat membatasi penggunaan, mereka melakukannya untuk memenuhi janji komputasi berkinerja tinggi dengan cara yang aman.

Struktur ReadOnly

Anda dapat membuat anotasi struktur dengan IsReadOnlyAttribute atribut . Contohnya:

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

IsReadOnly tidak menyiratkan Struct. Anda harus menambahkan keduanya untuk memiliki IsReadOnly struktur.

Penggunaan atribut ini memancarkan metadata yang memungkinkan F# dan C# tahu untuk memperlakukannya sebagai inref<'T> dan in ref, masing-masing.

Menentukan nilai yang dapat diubah di dalam struktur baca-saja menghasilkan kesalahan.

Struct Records dan Discriminated Unions

Anda dapat mewakili Rekaman dan Serikat Yang Didiskriminasi sebagai struktur dengan [<Struct>] atribut . Lihat setiap artikel untuk mempelajari selengkapnya.

Lihat juga