Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Properti adalah anggota yang mewakili nilai yang terkait dengan objek.
Sintaksis
// Property that has both get and set defined.
[ attributes ]
[ static ] member [accessibility-modifier] [self-identifier.]PropertyName
with [ attributes-for-get ] [accessibility-modifier] get() =
get-function-body
and [ attributes-for-set ] [accessibility-modifier] set parameter =
set-function-body
// Alternative syntax for a property that has get and set.
[ static ] member [accessibility-modifier-for-get] [self-identifier.]PropertyName
with [ attributes-for-get ] get() =
get-function-body
[ static ] member [accessibility-modifier-for-set] [self-identifier.]PropertyName
with [ attributes-for-set ] set parameter =
set-function-body
// Property that has get only.
[ attributes ]
[ static ] member [accessibility-modifier] [self-identifier.]PropertyName =
get-function-body
// Alternative syntax for property that has get only.
[ static ] member [accessibility-modifier] [self-identifier.]PropertyName
with [ attributes ] get() =
get-function-body
// Property that has set only.
[ static ] member [accessibility-modifier] [self-identifier.]PropertyName
with [ attributes ] set parameter =
set-function-body
// Automatically implemented properties.
[ attributes ]
[ static ] member val [accessibility-modifier] PropertyName = initialization-expression [ with get, set ]
Komentar
Properti mewakili hubungan "memiliki" dalam pemrograman berorientasi objek, mewakili data yang terkait dengan instans objek atau, untuk properti statis, dengan jenisnya.
Anda dapat mendeklarasikan properti dengan dua cara, tergantung pada apakah Anda ingin secara eksplisit menentukan nilai yang mendasar (juga disebut penyimpanan backing) untuk properti, atau jika Anda ingin mengizinkan pengkompilasi untuk secara otomatis menghasilkan penyimpanan cadangan untuk Anda. Umumnya, Anda harus menggunakan cara yang lebih eksplisit jika properti memiliki implementasi non-sepele dan cara otomatis ketika properti hanyalah pembungkus sederhana untuk nilai atau variabel. Untuk mendeklarasikan properti secara eksplisit, gunakan member kata kunci. Sintaksis deklaratif ini diikuti oleh sintaksis yang menentukan get metode dan set , juga bernama pengaktif. Berbagai bentuk sintaks eksplisit yang ditunjukkan di bagian sintaks digunakan untuk properti baca/tulis, baca-saja, dan tulis-saja. Untuk properti baca-saja, Anda hanya get menentukan metode; untuk properti tulis-saja, tentukan hanya set metode. Perhatikan bahwa ketika properti memiliki aksesor get dan set , sintaks alternatif memungkinkan Anda menentukan atribut dan pengubah aksesibilitas yang berbeda untuk setiap aksesor, seperti yang ditunjukkan dalam kode berikut.
// A read-only property.
member this.MyReadOnlyProperty = myInternalValue
// A write-only property.
member this.MyWriteOnlyProperty with set (value) = myInternalValue <- value
// A read-write property.
member this.MyReadWriteProperty
with get () = myInternalValue
and set (value) = myInternalValue <- value
Untuk properti baca/tulis, yang memiliki get metode dan set , urutan get dan set dapat dibalik. Atau, Anda dapat memberikan sintaks get yang ditampilkan hanya dan sintaks yang ditampilkan hanya alih-alih set menggunakan sintaks gabungan. Melakukan ini membuatnya lebih mudah untuk mengomentari individu get atau set metode, jika itu adalah sesuatu yang mungkin perlu Anda lakukan. Alternatif untuk menggunakan sintaks gabungan ini diperlihatkan dalam kode berikut.
member this.MyReadWriteProperty with get () = myInternalValue
member this.MyReadWriteProperty with set (value) = myInternalValue <- value
Nilai privat yang menyimpan data untuk properti disebut penyimpanan backing. Agar pengkompilasi membuat penyimpanan backing secara otomatis, gunakan kata kunci member val, hilangkan pengidentifikasi mandiri, lalu berikan ekspresi untuk menginisialisasi properti. Jika properti akan dapat diubah, sertakan with get, set. Misalnya, jenis kelas berikut menyertakan dua properti yang diimplementasikan secara otomatis.
Property1 bersifat baca-saja dan diinisialisasi ke argumen yang disediakan untuk konstruktor utama, dan Property2 merupakan properti yang dapat diatur yang diinisialisasi ke string kosong:
type MyClass(property1 : int) =
member val Property1 = property1
member val Property2 = "" with get, set
Properti yang diimplementasikan secara otomatis adalah bagian dari inisialisasi jenis, sehingga harus disertakan sebelum definisi anggota lainnya, sama seperti let pengikatan dan do pengikatan dalam definisi jenis. Perhatikan bahwa ekspresi yang menginisialisasi properti yang diimplementasikan secara otomatis hanya dievaluasi setelah inisialisasi, dan tidak setiap kali properti diakses. Perilaku ini berbeda dengan perilaku properti yang diimplementasikan secara eksplisit. Apa artinya ini secara efektif adalah bahwa kode untuk menginisialisasi properti ini ditambahkan ke konstruktor kelas. Pertimbangkan kode berikut yang menunjukkan perbedaan ini:
type MyClass() =
let random = new System.Random()
member val AutoProperty = random.Next() with get, set
member this.ExplicitProperty = random.Next()
let class1 = new MyClass()
printfn $"class1.AutoProperty = %d{class1.AutoProperty}"
printfn $"class1.ExplicitProperty = %d{class1.ExplicitProperty}"
Hasil
class1.AutoProperty = 1853799794
class1.AutoProperty = 1853799794
class1.ExplicitProperty = 978922705
class1.ExplicitProperty = 1131210765
Output kode sebelumnya menunjukkan bahwa nilai AutoProperty tidak berubah saat dipanggil berulang kali, sedangkan ExplicitProperty perubahan setiap kali dipanggil. Ini menunjukkan bahwa ekspresi untuk properti yang diimplementasikan secara otomatis tidak dievaluasi setiap kali, seperti metode getter untuk properti eksplisit.
Peringatan
Ada beberapa pustaka, seperti Kerangka Kerja Entitas (System.Data.Entity) yang melakukan operasi kustom di konstruktor kelas dasar yang tidak berfungsi dengan baik dengan inisialisasi properti yang diterapkan secara otomatis. Dalam kasus tersebut, coba gunakan properti eksplisit.
Properti dapat menjadi anggota kelas, struktur, serikat yang diskriminasi, rekaman, antarmuka, dan ekstensi jenis dan juga dapat didefinisikan dalam ekspresi objek.
Atribut dapat diterapkan ke properti. Untuk menerapkan atribut ke properti, tulis atribut pada baris terpisah sebelum properti . Untuk informasi selengkapnya, lihat atribut .
Secara default, properti bersifat publik. Pengubah aksesibilitas juga dapat diterapkan ke properti. Untuk menerapkan pengubah aksesibilitas, tambahkan segera sebelum nama properti jika dimaksudkan untuk diterapkan ke get metode dan set ; tambahkan sebelum get kata kunci dan set jika aksesibilitas yang berbeda diperlukan untuk setiap aksesor.
Pengubah aksesibilitas dapat berupa salah satu hal berikut: public, , privateinternal. Untuk informasi selengkapnya, lihat Access Control.
Implementasi properti dijalankan setiap kali properti diakses.
Properti Statis dan Instans
Properti dapat berupa properti statis atau instans. Properti statis dapat dipanggil tanpa instans dan digunakan untuk nilai yang terkait dengan jenisnya, bukan dengan objek individual. Untuk properti statis, hilangkan pengidentifikasi mandiri. Pengidentifikasi mandiri diperlukan untuk properti instans.
Definisi properti statis berikut didasarkan pada skenario di mana Anda memiliki bidang myStaticValue statis yang merupakan penyimpanan backing untuk properti .
static member MyStaticProperty
with get() = myStaticValue
and set(value) = myStaticValue <- value
Properti juga dapat seperti array, dalam hal ini mereka disebut properti terindeks. Untuk informasi selengkapnya, lihat Properti Terindeks.
Ketik Anotasi untuk Properti
Dalam banyak kasus, pengompilasi memiliki informasi yang cukup untuk menyimpulkan jenis properti dari jenis penyimpanan backing, tetapi Anda dapat mengatur jenis secara eksplisit dengan menambahkan anotasi jenis.
// To apply a type annotation to a property that does not have an explicit
// get or set, apply the type annotation directly to the property.
member this.MyProperty1 : int = myInternalValue
// If there is a get or set, apply the type annotation to the get or set method.
member this.MyProperty2 with get() : int = myInternalValue
Menggunakan Properti set Accessors
Anda dapat mengatur properti yang menyediakan set aksesor dengan menggunakan <- operator.
// Assume that the constructor argument sets the initial value of the
// internal backing store.
let mutable myObject = new MyType(10)
myObject.MyProperty <- 20
printfn "%d" (myObject.MyProperty)
Outputnya adalah 20.
Properti Abstrak
Properti bisa abstrak. Seperti halnya metode, abstract hanya berarti bahwa ada pengiriman virtual yang terkait dengan properti . Properti abstrak dapat benar-benar abstrak, yaitu, tanpa definisi di kelas yang sama. Kelas yang berisi properti seperti itu oleh karena itu adalah kelas abstrak. Atau, abstrak hanya dapat berarti bahwa properti virtual, dan dalam hal ini, definisi harus ada di kelas yang sama. Perhatikan bahwa properti abstrak tidak boleh bersifat pribadi, dan jika satu aksesor abstrak, yang lain juga harus abstrak. Untuk informasi selengkapnya tentang kelas abstrak, lihat Kelas Abstrak.
// Abstract property in abstract class.
// The property is an int type that has a get and
// set method
[<AbstractClass>]
type AbstractBase() =
abstract Property1: int with get, set
// Implementation of the abstract property
type Derived1() =
inherit AbstractBase()
let mutable value = 10
override this.Property1
with get () = value
and set (v: int) = value <- v
// A type with a "virtual" property.
type Base1() =
let mutable value = 10
abstract Property1: int with get, set
default this.Property1
with get () = value
and set (v: int) = value <- v
// A derived type that overrides the virtual property
type Derived2() =
inherit Base1()
let mutable value2 = 11
override this.Property1
with get () = value2
and set (v) = value2 <- v