Özellikler (C# Programlama Kılavuzu)

Özellik, özel bir alanın değerini okumak, yazmak veya hesaplamak için esnek bir mekanizma sağlayan bir üyedir. Özellikler genel veri üyeleri gibi kullanılabilir, ancak erişimci olarak adlandırılan özel yöntemlerdir. Bu özellik verilere kolayca erişilmesine olanak tanır ve yine de yöntemlerin güvenliğini ve esnekliğini yükseltmeye yardımcı olur.

Özelliklere genel bakış

  • Özellikler, bir sınıfın uygulama veya doğrulama kodunu gizlerken değerleri alma ve ayarlamanın genel bir yolunu ortaya çıkarmasını sağlar.
  • Özellik değerini döndürmek için get özellik erişimcisi kullanılır ve yeni bir değer atamak için bir set özellik erişimcisi kullanılır. Yalnızca nesne oluşturma sırasında yeni bir değer atamak için bir init özellik erişimcisi kullanılır. Bu erişimcilerin farklı erişim düzeyleri olabilir. Daha fazla bilgi için bkz . Erişimci Erişilebilirliğini Kısıtlama.
  • value anahtar sözcüğü, veya init erişimcisinin set atadığına ilişkin değeri tanımlamak için kullanılır.
  • Özellikler okuma-yazma (hem bir get hem de bir set erişimciye sahipler), salt okunur (erişimcileri get var ama erişimcileri yokset) veya salt yazma (erişimcileri set var ama erişimci yokget) olabilir. Yalnızca yazma özellikleri nadirdir ve en yaygın olarak hassas verilere erişimi kısıtlamak için kullanılır.
  • Özel erişimci kodu gerektirmeyen basit özellikler, ifade gövdesi tanımları veya otomatik olarak uygulanan özellikler olarak uygulanabilir.

Yedekleme alanları olan özellikler

Bir özelliği uygulamaya yönelik temel desenlerden biri, özellik değerini ayarlamak ve almak için özel bir yedekleme alanı kullanmayı içerir. Erişimci get özel alanın değerini döndürür ve set erişimci özel alana bir değer atamadan önce bazı veri doğrulama işlemleri gerçekleştirebilir. Her iki erişimci de veriler depolanmadan veya döndürülmeden önce bazı dönüştürme veya hesaplamalar gerçekleştirebilir.

Aşağıdaki örnekte bu desen gösterilmektedir. Bu örnekte, TimePeriod sınıfı bir zaman aralığını temsil eder. Dahili olarak, sınıfı zaman aralığını adlı _secondsözel bir alanda saniye cinsinden depolar. adlı Hours bir okuma-yazma özelliği, müşterinin saat cinsinden zaman aralığını belirtmesine olanak tanır. get Hem hem de set erişimcileri saat ve saniyeler arasında gerekli dönüştürmeyi gerçekleştirir. Buna ek olarak, set erişimci verileri doğrular ve saat sayısı geçersizse bir ArgumentOutOfRangeException oluşturur.

public class TimePeriod
{
    private double _seconds;

    public double Hours
    {
        get { return _seconds / 3600; }
        set
        {
            if (value < 0 || value > 24)
                throw new ArgumentOutOfRangeException(nameof(value),
                      "The valid range is between 0 and 24.");

            _seconds = value * 3600;
        }
    }
}

Aşağıdaki örnekte gösterildiği gibi değeri almak ve ayarlamak için özelliklere erişebilirsiniz:

TimePeriod t = new TimePeriod();
// The property assignment causes the 'set' accessor to be called.
t.Hours = 24;

// Retrieving the property causes the 'get' accessor to be called.
Console.WriteLine($"Time in hours: {t.Hours}");
// The example displays the following output:
//    Time in hours: 24

İfade gövdesi tanımları

Özellik erişimcileri genellikle yalnızca bir ifadenin sonucunu atayan veya döndüren tek satırlı deyimlerden oluşur. Bu özellikleri ifade gövdeli üyeler olarak uygulayabilirsiniz. İfade gövdesi tanımları, simgesinden => ve ardından özelliğine atanacak veya özelliğinden alınacak ifadeden oluşur.

Salt okunur özellikler, erişimciyi get ifade gövdeli üye olarak uygulayabilir. Bu durumda, erişimci get anahtar sözcüğü veya return anahtar sözcük kullanılmaz. Aşağıdaki örnek salt okunur Name özelliğini ifade gövdeli üye olarak uygular.

public class Person
{
    private string _firstName;
    private string _lastName;

    public Person(string first, string last)
    {
        _firstName = first;
        _lastName = last;
    }

    public string Name => $"{_firstName} {_lastName}";
}

Hem hem get de set erişimci ifade gövdeli üyeler olarak uygulanabilir. Bu durumda ve getset anahtar sözcükleri mevcut olmalıdır. Aşağıdaki örnekte her iki erişimci için de ifade gövdesi tanımlarının kullanımı gösterilmektedir. anahtar return sözcüğü erişimciyle get birlikte kullanılmaz.

public class SaleItem
{
    string _name;
    decimal _cost;

    public SaleItem(string name, decimal cost)
    {
        _name = name;
        _cost = cost;
    }

    public string Name
    {
        get => _name;
        set => _name = value;
    }

    public decimal Price
    {
        get => _cost;
        set => _cost = value;
    }
}

Otomatik uygulanan özellikler

Bazı durumlarda, özellik get ve set erişimciler herhangi bir ek mantık eklemeden yalnızca bir yedekleme alanına değer atar veya bu alandan bir değer alır. Otomatik olarak uygulanan özellikleri kullanarak, C# derleyicisinin sizin için destek alanını saydam bir şekilde sağlamasına olanak tanırken kodunuzu basitleştirebilirsiniz.

Bir özelliğin hem a hem set de get (veya get a ve init) erişimcisi varsa, her ikisi de otomatik olarak uygulanmalıdır. Hiçbir uygulama sağlamadan ve set anahtar sözcüklerini kullanarak get otomatik uygulanan bir özellik tanımlarsınız. Aşağıdaki örnek, ve otomatik olarak uygulanan özellikler dışında NamePrice öncekini yineler. Örnek ayrıca parametreli oluşturucuyu da kaldırır, böylece SaleItem nesneler artık parametresiz oluşturucuya ve nesne başlatıcıya yapılan bir çağrıyla başlatılır.

public class SaleItem
{
    public string Name
    { get; set; }

    public decimal Price
    { get; set; }
}

Otomatik uygulanan özellikler ve set erişimcileri için get farklı erişim özellikleri bildirebilir. Genel erişimciyi get ve özel set erişimciyi genellikle bildirirsiniz. Erişimci erişilebilirliğini kısıtlama makalesinde daha fazla bilgi edinebilirsiniz.

Gerekli özellikler

C# 11'le başlayarak, istemci kodunu herhangi bir özelliği veya alanı başlatmaya zorlamak için üyeyi ekleyebilirsiniz required :

public class SaleItem
{
    public required string Name
    { get; set; }

    public required decimal Price
    { get; set; }
}

oluşturmak SaleItemiçin, aşağıdaki kodda Name gösterildiği gibi nesne başlatıcılarını kullanarak hem ve Price özelliklerini ayarlamanız gerekir:

var item = new SaleItem { Name = "Shoes", Price = 19.95m };
Console.WriteLine($"{item.Name}: sells for {item.Price:C2}");

C# Dil Belirtimi

Daha fazla bilgi için bkz. C# Dil Belirtimi'ndeki Özellikler. Dil belirtimi, C# sözdizimi ve kullanımı için kesin bir kaynaktır.

Ayrıca bkz.