Özellikler (F#)
Özellikler , bir nesneyle ilişkili değerleri temsil eden üyelerdir.
Sözdizimi
// Property that has both get and set defined.
[ attributes ]
[ static ] member [accessibility-modifier] [self-identifier.]PropertyName
with [accessibility-modifier] get() =
get-function-body
and [accessibility-modifier] set parameter =
set-function-body
// Alternative syntax for a property that has get and set.
[ attributes-for-get ]
[ static ] member [accessibility-modifier-for-get] [self-identifier.]PropertyName =
get-function-body
[ attributes-for-set ]
[ static ] member [accessibility-modifier-for-set] [self-identifier.]PropertyName
with 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.
[ attributes ]
[ static ] member [accessibility-modifier] [self-identifier.]PropertyName
with get() =
get-function-body
// Property that has set only.
[ attributes ]
[ static ] member [accessibility-modifier] [self-identifier.]PropertyName
with set parameter =
set-function-body
// Automatically implemented properties.
[ attributes ]
[ static ] member val [accessibility-modifier] PropertyName = initialization-expression [ with get, set ]
Açıklamalar
Özellikler nesne tabanlı programlamada "sahip" ilişkisini temsil eder, nesne örnekleriyle ilişkili verileri veya statik özellikler için türüyle temsil eder.
Özellik için temel alınan değeri (yedekleme deposu olarak da adlandırılır) açıkça belirtmek isteyip istemediğinize veya derleyicinin sizin için otomatik olarak yedekleme deposu oluşturmasına izin vermek istediğinize bağlı olarak, özellikleri iki şekilde bildirebilirsiniz. Genellikle, özelliğin önemsiz olmayan bir uygulaması varsa daha açık bir yol ve özellik bir değer veya değişken için yalnızca basit bir sarmalayıcı olduğunda otomatik yolu kullanmanız gerekir. Bir özelliği açıkça bildirmek için anahtar sözcüğünü member
kullanın. Bu bildirim temelli söz diziminin ardından ve yöntemlerini belirten get
söz dizimi (aynı zamanda erişimciler olarak da adlandırılır).set
Söz dizimi bölümünde gösterilen açık söz diziminin çeşitli biçimleri okuma/yazma, salt okunur ve salt yazma özellikleri için kullanılır. Salt okunur özellikler için yalnızca bir get
yöntem tanımlarsınız; salt yazma özellikleri için yalnızca bir set
yöntem tanımlayın. Bir özelliğin hem hem de get
set
erişimcileri olduğunda, alternatif söz diziminin aşağıdaki kodda gösterildiği gibi her erişimci için farklı öznitelikler ve erişilebilirlik değiştiricileri belirtmenize olanak sağladığını unutmayın.
// 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
Hem hem set
de get
yöntemi olan okuma/yazma özellikleri için ve set
sırası get
tersine çevrilebilir. Alternatif olarak, birleştirilmiş söz dizimini kullanmak yerine yalnızca için get
gösterilen söz dizimini ve yalnızca için set
gösterilen söz dizimini sağlayabilirsiniz. Bunu yapmak, yapmanız gerekebilecek bir şeyse tek tek get
veya set
yöntemi açıklama satırı yapmayı kolaylaştırır. Birleştirilmiş söz dizimini kullanmanın alternatifi aşağıdaki kodda gösterilmiştir.
member this.MyReadWriteProperty with get () = myInternalValue
member this.MyReadWriteProperty with set (value) = myInternalValue <- value
Özellikler için verileri tutan özel değerlere yedekleme depoları adı verilir. Derleyicinin otomatik olarak yedekleme deposu oluşturmasını sağlamak için anahtar sözcüklerini member val
kullanın, kendi tanımlayıcısını atlayın ve ardından özelliği başlatmak için bir ifade sağlayın. Özelliğin değiştirilebilir olması gerekiyorsa ekleyin with get, set
. Örneğin, aşağıdaki sınıf türü otomatik olarak uygulanan iki özellik içerir. Property1
salt okunurdur ve birincil oluşturucuya sağlanan bağımsız değişkene başlatılır ve Property2
boş bir dizeye başlatılan ayarlanabilir bir özelliktir:
type MyClass(property1 : int) =
member val Property1 = property1
member val Property2 = "" with get, set
Otomatik olarak uygulanan özellikler bir türün başlatılmasının bir parçasıdır, bu nedenle bir tür tanımındaki bağlamalar ve do
bağlamalar gibi let
diğer üye tanımlarından önce dahil edilmelidir. Otomatik olarak uygulanan bir özelliği başlatan ifadenin, özelliğe her erişildiğinde değil, yalnızca başlatma sonrasında değerlendirildiğini unutmayın. Bu davranış, açıkça uygulanan bir özelliğin davranışının aksinedir. Bunun etkili bir şekilde anlamı, bu özellikleri başlatma kodunun bir sınıfın oluşturucusunun eklenmesidir. Bu farkı gösteren aşağıdaki kodu göz önünde bulundurun:
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}"
Çıktı
class1.AutoProperty = 1853799794
class1.AutoProperty = 1853799794
class1.ExplicitProperty = 978922705
class1.ExplicitProperty = 1131210765
Yukarıdaki kodun çıktısı, AutoProperty değerinin art arda çağrıldığında değişmediğini gösterirken, ExplicitProperty her çağrıldığında değişir. Bu, otomatik olarak uygulanan bir özelliğin ifadesinin, açık özelliğin getter yöntemi gibi her seferinde değerlendirilmediğini gösterir.
Uyarı
Otomatik olarak uygulanan özelliklerin başlatılmasıyla iyi çalışmayan temel sınıf oluşturucularında özel işlemler gerçekleştiren Entity Framework (System.Data.Entity
) gibi bazı kitaplıklar vardır. Bu gibi durumlarda, açık özellikleri kullanmayı deneyin.
Özellikler sınıfların, yapıların, ayrımcı birleşimlerin, kayıtların, arabirimlerin ve tür uzantılarının üyeleri olabilir ve nesne ifadelerinde de tanımlanabilir.
Öznitelikler özelliklere uygulanabilir. Özelliğe öznitelik uygulamak için özniteliğini özelliğinden önce ayrı bir satıra yazın. Daha fazla bilgi için bkz . Öznitelikler.
Varsayılan olarak, özellikler geneldir. Erişilebilirlik değiştiricileri özelliklere de uygulanabilir. Erişilebilirlik değiştiricisini uygulamak için, hem ve set
yöntemlerine uygulanması amaçlanıyorsa özelliğin adından get
hemen önce ekleyin; her erişimci için farklı erişilebilirlik gerekiyorsa bunu ve set
anahtar sözcüklerinden önce get
ekleyin. Erişilebilirlik değiştirici aşağıdakilerden biri olabilir: public
, private
, internal
. Daha fazla bilgi için bkz. Erişim Denetimi.
Özellik uygulamaları, bir özelliğe her erişildiğinde yürütülür.
Statik ve Örnek Özellikleri
Özellikler statik veya örnek özellikleri olabilir. Statik özellikler bir örnek olmadan çağrılabilir ve tek tek nesnelerle değil, türle ilişkili değerler için kullanılır. Statik özellikler için kendi tanımlayıcısını atlar. Örnek özellikleri için kendi tanımlayıcısı gereklidir.
Aşağıdaki statik özellik tanımı, özelliği için yedekleme deposu olan statik bir alana myStaticValue
sahip olduğunuz bir senaryoyu temel alır.
static member MyStaticProperty
with get() = myStaticValue
and set(value) = myStaticValue <- value
Özellikler dizi benzeri de olabilir; bu durumda bunlar dizinli özellikler olarak adlandırılır. Daha fazla bilgi için bkz . Dizinli Özellikler.
Özellikler için Tür Ek Açıklaması
Çoğu durumda, derleyici bir özelliğin türünü yedekleme deposunun türünden çıkarsamak için yeterli bilgiye sahiptir, ancak tür ek açıklaması ekleyerek türü açıkça ayarlayabilirsiniz.
// 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
Özellik kümesi Erişimcilerini kullanma
İşlecini kullanarak <-
erişimci sağlayan set
özellikleri ayarlayabilirsiniz.
// 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)
Çıkış 20'dir.
Soyut Özellikler
Özellikler soyut olabilir. Yöntemlerde olduğu gibi, abstract
özelliğiyle ilişkilendirilmiş bir sanal gönderim olduğu anlamına gelir. Soyut özellikler, aynı sınıfta bir tanım olmadan gerçekten soyut olabilir. Bu nedenle böyle bir özellik içeren sınıf soyut bir sınıftır. Alternatif olarak, soyut yalnızca bir özelliğin sanal olduğu ve bu durumda bir tanımın aynı sınıfta mevcut olması gerektiği anlamına gelebilir. Soyut özelliklerin özel olmaması gerektiğini ve bir erişimci soyutsa, diğerinin de soyut olması gerektiğini unutmayın. Soyut sınıflar hakkında daha fazla bilgi için bkz . Soyut Sınıflar.
// 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