Aracılığıyla paylaş


Ö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 olarak 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 olarak uygulanan bir özellik gösterilmektedir. Derleyici özelliği için gizli bir yedekleme alanı oluşturur. Derleyici ayrıca ve get erişimcilerinin gövdesini set de uygular. Tüm öznitelikler otomatik olarak 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.
}

Alan destekli özellikler

C# 13'te anahtar sözcük önizleme özelliğini kullanarak bir özelliğin erişimcisine field doğrulama veya başka bir mantık ekleyebilirsiniz. anahtar sözcüğü, field bir özellik için derleyici tarafından sentezlenen yedekleme alanına erişir. Ayrı bir yedekleme alanını açıkça bildirmeden bir özellik erişimcisi yazmanızı sağlar.

public class Person
{
    public string? FirstName 
    { 
        get;
        set => field = value.Trim(); 
    }

    // Omitted for brevity.
}

Önemli

Anahtar field sözcük, C# 13'teki bir önizleme özelliğidir. Bağlamsal anahtar sözcüğü kullanmak için <LangVersion> proje dosyanızda .NET 9 kullanıyor preview olmanız ve öğenizi field olarak ayarlamanız gerekir.

adlı fieldbir alanı olan bir sınıfta anahtar sözcük özelliğini kullanırken field dikkatli olmalısınız. Yeni field anahtar sözcük, özellik erişimcisi kapsamında adlı field bir alanın gölgesini oluşturur. Değişkenin adını değiştirebilir veya tanımlayıcıya olarak başvurmak field için belirteci kullanabilirsiniz@.field@field Anahtar sözcüğüfield okuyarak daha fazla bilgi edinebilirsiniz.

Gerekli özellikler

Yukarıdaki örnek, bir çağıranın özelliğini ayarlamadan varsayılan oluşturucuyu kullanarak oluşturmasına PersonFirstName 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ümbildirir. Bu oluşturucuyu kullanan çağıranların bir nesne başlatıcı ile özellik ayarlaması required gerekmez.

Önemli

Boş değer atanamazrequiredkarıştırmayın. bir özelliği required veya nullolarak ayarlamak default 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.

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 sınıfındaki diğer yöntemlerden özelliğinin FirstName değerini değiştirmeyi etkinleştirmesi gerektiğini varsayalım. Veya yerine privateinternalküme erişimcisine public erişilebilirlik verebilirsiniz:

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 FirstNamepublic, ancak küme erişimcisi şeklindedir private. Bir erişimci ile private özellik public bildiremediniz. Özellik bildirimleri , , protectedinternalveya hatta protected internalbildirilebilirprivate.

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 privateset daha kısıtlayıcıdır.
  • Otomatik olarak uygulanan bir özellik, erişimci olmadan bir getset 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 init daha set 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 set erişimci yapabilirsinizinit:

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.

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 FirstName özellikleri salt okunur olduğundan LastName bu uygulama çalışır. kişiler adlarını değiştirebilir. FirstName erişimcilere izin vermek LastName için ve set ö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 set özelliğinin FirstName erişimcilerini LastName değiştirirsinizfullName:

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 özelliklerpartialpartial Bir partial özellik için uygulama bildirimi otomatik olarak uygulanan bir özellik olamaz. Otomatik olarak uygulanan bir özellik, kısmi özellik bildirimiyle aynı söz dizimini kullanır.

Özellikler

Ö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.

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.