Ö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 getset 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 valkullanı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

Ayrıca bkz.