Özellikler (C# Programlama Kılavuzu)

Özellik, veri alanının değerini okumak, yazmak veya hesaplamak için esnek bir mekanizma sağlayan bir üyedir. Özellikler genel veri üyeleri olarak görünür, ancak erişimci olarak adlandırılan özel yöntemler olarak uygulanır. Bu özellik, arayanların verilere kolayca erişmesini sağlar ve yine de veri güvenliğini ve esnekliğini yükseltmeye yardımcı olur. Özelliklerin söz dizimi, alanlara yönelik doğal bir uzantıdır. Bir alan bir depolama konumu tanımlar:

public class Person
{
    public string? FirstName;

    // Omitted for brevity.
}

Otomatik uygulanan özellikler

Özellik tanımı, bir get ve set erişimcisi için bu özelliğin değerini alan ve atayan bildirimler içerir:

public class Person
{
    public string? FirstName { get; set; }

    // Omitted for brevity.
}

Yukarıdaki örnekte otomatik uygulanan bir özellik gösterilmektedir. Derleyici özelliği için gizli bir yedekleme alanı oluşturur. Derleyici ayrıca ve set erişimcilerinin gövdesini get de uygular. Tüm öznitelikler otomatik uygulanan özelliğe uygulanır. özniteliğini, özniteliğinde etiketi belirterek field: derleyici tarafından oluşturulan yedekleme alanına uygulayabilirsiniz.

Özelliğin kapanış ayracından sonra bir değer ayarlayarak varsayılan değer dışında bir değere özellik başlatabilirsiniz. özelliği için ilk değerin FirstName yerine nullboş dize olmasını tercih edebilirsiniz. Bunu aşağıdaki kodda gösterildiği gibi belirtebilirsiniz:

public class Person
{
    public string FirstName { get; set; } = string.Empty;

    // Omitted for brevity.
}

Erişim denetimi

Yukarıdaki örneklerde okuma/yazma özellikleri gösterildi. Ayrıca salt okunur özellikler oluşturabilir veya kümeye farklı erişilebilirlikler verip erişimcileri alabilirsiniz. Sınıfınızın Person yalnızca bu sınıftaki diğer yöntemlerden özelliğinin FirstName değerini değiştirmeyi etkinleştirmesi gerektiğini varsayalım. Set erişimcisine private yerine erişilebilirlik publicverebilirsiniz:

public class Person
{
    public string? FirstName { get; private set; }

    // Omitted for brevity.
}

FirstName özelliği herhangi bir koddan okunabilir, ancak yalnızca sınıfındaki Person koddan atanabilir.

Kümeye herhangi bir kısıtlayıcı erişim değiştirici ekleyebilir veya erişimcileri alabilirsiniz. Tek bir erişimcideki erişim değiştirici özelliğin erişiminden daha kısıtlayıcı olmalıdır. Özelliği olduğundan yukarıdaki kod yasaldır FirstName public, ancak küme erişimcisi şeklindedir private. Bir erişimci ile public özellik private bildiremediniz. Özellik bildirimleri , , internalprotected internalveya hatta privatebildirilebilirprotected.

Erişimciler için set iki özel erişim değiştirici vardır:

  • Erişimcinin set erişim değiştiricisi olabilir init . Bu set erişimci yalnızca bir nesne başlatıcıdan veya türün oluşturucularından çağrılabilir. Erişimciden private set daha kısıtlayıcıdır.
  • Otomatik uygulanan bir özellik, erişimci olmadan bir get set erişimci bildirebilir. Bu durumda, derleyici erişimcinin set yalnızca türün oluşturucularından çağrılmasını sağlar. Aksesuardaki aksesuardan set daha init kısıtlayıcıdır.

sınıfını Person aşağıdaki gibi değiştirin:

public class Person
{
    public Person(string firstName) => FirstName = firstName;

    public string FirstName { get; }

    // Omitted for brevity.
}

Yukarıdaki örnek, çağıranların parametresini içeren oluşturucuyu FirstName kullanmasını gerektirir. Çağıranlar, özelliğine bir değer atamak için nesne başlatıcılarını kullanamaz. Başlatıcıları desteklemek için, aşağıdaki kodda gösterildiği gibi erişimciyi bir init erişimci yapabilirsinizset:

public class Person
{
    public Person() { }
    public Person(string firstName) => FirstName = firstName;

    public string? FirstName { get; init; }

    // Omitted for brevity.
}

Bu değiştiriciler genellikle düzgün başlatmayı zorlamak için değiştirici ile birlikte required kullanılır.

Gerekli özellikler

Yukarıdaki örnek, bir çağıranın özelliğini ayarlamadan varsayılan oluşturucuyu kullanarak oluşturmasına Person FirstName olanak tanır. özelliği türü null atanabilir bir dize olarak değiştirildi. C# 11'den başlayarak, çağıranların bir özellik ayarlamasını gerektirebilirsiniz:

public class Person
{
    public Person() { }

    [SetsRequiredMembers]
    public Person(string firstName) => FirstName = firstName;

    public required string FirstName { get; init; }

    // Omitted for brevity.
}

Yukarıdaki kod, sınıfında iki değişiklik Person yapar. İlk olarak, FirstName özellik bildirimi değiştiriciyi required içerir. Bu, yeni Person bir kod oluşturan tüm kodların bu özelliği bir nesne başlatıcı kullanarak ayarlaması gerektiği anlamına gelir. İkincisi, parametre firstName alan oluşturucu özniteliğine System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute sahiptir. Bu öznitelik, derleyiciye bu oluşturucunun tüm required üyeleri ayarlandığını bildirir. Bu oluşturucuyu kullanan çağıranların bir nesne başlatıcı ile özellik ayarlaması required gerekmez.

Önemli

Boş değer atanamaz ile karıştırmayınrequired. bir özelliği null veya defaultolarak ayarlamak required için geçerlidir. Bu örneklerde olduğu gibi string tür null atanamazsa, derleyici bir uyarı döndürür.

var aPerson = new Person("John");
aPerson = new Person{ FirstName = "John"};
// Error CS9035: Required member `Person.FirstName` must be set:
//aPerson2 = new Person();

İfade gövdesi tanımları

Özellik erişimcileri genellikle tek satırlı deyimlerden oluşur. Erişimciler bir ifadenin sonucunu atar veya döndürür. Bu özellikleri ifade gövdeli üyeler olarak uygulayabilirsiniz. İfade gövdesi tanımları, belirteci ve ardından özelliğine atanacak veya özelliğinden alınacak ifadeyi oluşturur => .

Salt okunur özellikler, erişimciyi get ifade gövdeli üye olarak uygulayabilir. Aşağıdaki örnek salt okunur Name özelliğini ifade gövdeli üye olarak uygular:

public class Person
{
    public Person() { }

    [SetsRequiredMembers]
    public Person(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
    }

    public required string FirstName { get; init; }
    public required string LastName { get; init; }

    public string Name => $"{FirstName} {LastName}";

    // Omitted for brevity.
}

Name özelliği hesaplanan bir özelliktir. için Namebir yedekleme alanı yok. özelliği her seferinde bunu hesaplar.

Yedekleme alanları olan özellikler

Hesaplanan özellik kavramını özel bir alanla karıştırabilir ve önbelleğe alınmış bir değerlendirilen özellik oluşturabilirsiniz. Örneğin, dize biçimlendirmesinin FullName ilk erişimde gerçekleşmesi için özelliğini güncelleştirin:

public class Person
{
    public Person() { }

    [SetsRequiredMembers]
    public Person(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
    }

    public required string FirstName { get; init; }
    public required string LastName { get; init; }

    private string? _fullName;
    public string FullName
    {
        get
        {
            if (_fullName is null)
                _fullName = $"{FirstName} {LastName}";
            return _fullName;
        }
    }
}

ve LastName özellikleri salt okunur olduğundan FirstName bu uygulama çalışır. kişiler adlarını değiştirebilir. FirstName erişimcilere izin vermek set için ve LastName özelliklerini güncelleştirmek için fullNameönbelleğe alınmış tüm değerleri geçersiz kılmanız gerekir. alan yeniden hesaplanacak şekilde ve LastName özelliğinin fullName erişimcilerini FirstName değiştirirsinizset:

public class Person
{
    private string? _firstName;
    public string? FirstName
    {
        get => _firstName;
        set
        {
            _firstName = value;
            _fullName = null;
        }
    }

    private string? _lastName;
    public string? LastName
    {
        get => _lastName;
        set
        {
            _lastName = value;
            _fullName = null;
        }
    }

    private string? _fullName;
    public string FullName
    {
        get
        {
            if (_fullName is null)
                _fullName = $"{FirstName} {LastName}";
            return _fullName;
        }
    }
}

Bu son sürüm yalnızca gerektiğinde özelliğini değerlendirir FullName . Daha önce hesaplanan sürüm geçerliyse kullanılır. Aksi takdirde, hesaplama önbelleğe alınan değeri güncelleştirir. Bu sınıfı kullanan geliştiricilerin uygulamanın ayrıntılarını bilmesi gerekmez. Bu iç değişikliklerin hiçbiri Person nesnesinin kullanımını etkilemez.

C# 13'le başlayarak, sınıflarda özellikler oluşturabilirsiniz.partial partial Bir partial özellik için uygulama bildirimi otomatik olarak uygulanan bir özellik olamaz. Otomatik uygulanan bir özellik, kısmi özellik bildirimiyle aynı söz dizimini kullanır.

Properties

Özellikler, bir sınıf veya nesnedeki akıllı alanların bir biçimidir. Nesnenin dışından, nesnedeki alanlar gibi görünürler. Ancak, özellikler C# işlevselliğinin tam paleti kullanılarak uygulanabilir. Doğrulama, farklı erişilebilirlik, gecikmeli değerlendirme veya senaryolarınızın ihtiyaç duyduğu gereksinimleri sağlayabilirsiniz.

  • Özel erişimci kodu gerektirmeyen basit özellikler, ifade gövdesi tanımları veya otomatik olarak uygulanan özellikler olarak uygulanabilir.
  • Ö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.

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.