Aracılığıyla paylaş


gerekli modifikatör (C# Referans)

required değiştiricisi, alanının veya uygulandığı özelliğinin, bir nesne başlatıcısıtarafından başlatılması gerektiğini gösterir. Türün yeni bir örneğini oluşturan herhangi bir ifade, gerekli tüm üyeleribaşlatmalıdır. required değiştiricisi C# 11 ile başlayarak kullanılabilir. required değiştiricisi, geliştiricilerin özelliklerin veya alanların düzgün şekilde başlatılması gereken türler oluşturmasına olanak tanır, ancak yine de nesne başlatıcıları kullanarak başlatmaya izin verir. Çeşitli kurallar bu davranışı sağlar:

  • required değiştirici, struct'te bildirilen alanlarına ve özelliklerine, class türlerinde, dahil olmak üzere record ve record struct türlerine uygulanabilir. required değiştirici, interfaceüyelerine uygulanamaz.
  • Açık arabirim uygulamaları requiredolarak işaretlenemez. Bunlar nesne başlatıcılarda ayarlanamaz.
  • Gerekli üyelerin başlatılması gerekir, ancak nullolarak başlatılabilirler. Tür null atanamaz bir başvuru türüyse, nulliçin üyeyi başlatırsanız derleyici bir uyarı döndürür. Derleyici, üye hiç başlatılmamışsa bir hata verir.
  • Gerekli üyelerin en az kendi türü kadar görünür olması gerekir. Örneğin, bir public sınıfı protectedbir required alanı içeremez. Ayrıca, gerekli özelliklerin en az içerdikleri türler kadar görünür olan değiştiricileri (set veya init erişimcileri) olması gerekir. Erişilebilir olmayan üyeler, örnek oluşturan kod tarafından ayarlanamaz.
  • Türetilmiş sınıflar, temel sınıfta bildirilen bir required üyesini gizleyemez. Gerekli bir üyeyi gizlemek, çağıranların bunun için nesne başlatıcıları kullanmasını engeller. Ayrıca, gerekli bir özelliği geçersiz kılan türetilmiş türler required değiştiriciyi içermelidir. Türetilen tür, required durumunu kaldıramaz. Türetilmiş türler, bir özelliği geçersiz kılma sırasında required değiştiriciyi ekleyebilir.
  • Herhangi bir required üyesi olan bir tür, tür parametresi new() kısıtlamasını içerdiğinde tür bağımsız değişkeni olarak kullanılamaz. Derleyici, tüm gerekli üyelerin genel kodda başlatılmasını zorunlu kılamaz.
  • required değiştiricisi, kayıtta konumsal parametreler için bildirimde kullanılamaz. required değiştiricisini içeren bir konumsal özellik için açık bir bildirim ekleyebilirsiniz.

konumsal kayıtlargibi bazı türler, konumsal özellikleri başlatmak için birincil oluşturucuyu kullanır. Bu özelliklerden herhangi biri required değiştiricisini içerirse, birincil oluşturucu SetsRequiredMembers özniteliğini ekler. Bu, birincil oluşturucunun tüm gerekli üyeleri başlatdığını gösterir. System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute özniteliğiyle kendi oluşturucunuzu yazabilirsiniz. Ancak, derleyici bu oluşturucuların gerekli tüm üyeleri başlatdığını doğrulamaz. Bunun yerine, öznitelik derleyiciye oluşturucunun tüm gerekli üyeleri başlattığını bildirir. SetsRequiredMembers özniteliği şu kuralları oluşturuculara ekler:

  • this()veya base()SetsRequiredMembers özniteliğiyle açıklama ekleyen başka bir oluşturucuya zincirleyen bir oluşturucu da SetsRequiredMembers özniteliğini içermelidir. Bu, çağıranların tüm uygun oluşturucuları doğru kullanabilmesini sağlar.
  • record türleri için oluşturulan kopyalama oluşturucuları, üyelerden biri requiredise SetsRequiredMembers özniteliğini uygular.

Uyarı

SetsRequiredMembers, bir nesne oluşturulduğunda derleyicinin tüm required üyelerinin başlatılıp başlatılmadığını kontrol etmesini devre dışı bırakır. Dikkatli kullanın.

Aşağıdaki kod, FirstName ve LastName özellikleri için required değiştiricisini kullanan bir sınıf hiyerarşisini gösterir:

public class Person
{
    public Person() { }

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

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

    public int? Age { get; set; }
}

public class Student : Person
{
    public Student() : base()
    {
    }

    [SetsRequiredMembers]
    public Student(string firstName, string lastName) :
        base(firstName, lastName)
    {
    }

    public double GPA { get; set; }
}

Gerekli üyeler hakkında daha fazla bilgi için bkz. C#11 - Gerekli üyeler özellik belirtimi.