gerekli değiştirici (C# Başvurusu)

Değiştirici, required uygulandığı alanın veya özelliğin bir nesne başlatıcı tarafından başlatılması gerektiğini belirtir. Türün yeni bir örneğini başlatan tüm ifadeler tüm gerekli üyeleri başlatmalıdır. Değiştirici required C# 11 ile başlayarak kullanılabilir. Değiştirici, geliştiricilerin required özelliklerin veya alanların düzgün bir ş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:

  • Değiştirici, içinde bildirilen structalanlara ve özelliklere ve class ve türleri de dahil olmak üzere record structrecord türlere uygulanabilir.required Değiştirici required , üyelerine interfaceuygulanamaz.
  • Açık arabirim uygulamaları olarak requiredişaretlenemez. Bunlar nesne başlatıcılarda ayarlanamaz.
  • Gerekli üyelerin başlatılması gerekir, ancak olarak başlatılabilirler null. Tür null atanamaz bir başvuru türüyse, üyesini nullolarak başlatırsanız derleyici bir uyarı döndürür. Derleyici, üye hiç başlatılmamışsa bir hata döndürür.
  • Gerekli üyelerin en az kendi türü kadar görünür olması gerekir. Örneğin, bir public sınıf olan protectedbir required alanı içeremez. Ayrıca, gerekli özelliklerin en az kendi içeren türleri kadar görünür olan ayarlayıcılara (set veya init erişimcilere) sahip 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 üyeyi 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 değiştiriciyi required içermelidir. Türetilen tür durumu kaldıramaz required . Türetilmiş türler bir özelliği geçersiz kılırken değiştiriciyi ekleyebilir required .
  • Tür parametresi kısıtlamayı içerdiğindenew(), herhangi required bir üyesi olan bir tür 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.
  • Kayıtta required konumsal parametreler için bildirimde değiştiriciye izin verilmez. Değiştiriciyi içeren required bir konumsal özellik için açık bir bildirim ekleyebilirsiniz.

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

  • özniteliğiyle SetsRequiredMembersthis()base()ek açıklama ekli başka bir oluşturucuya zincirleyen bir oluşturucu da özniteliğini SetsRequiredMembers içermelidir. Bu, çağıranların tüm uygun oluşturucuları doğru kullanabilmesini sağlar.
  • Türler SetsRequiredMembers için record oluşturulan kopya oluşturucuları, üyelerden requiredbiri ise özniteliğini uygular.

Uyarı

, SetsRequiredMembers derleyicinin bir nesne oluşturulduğunda tüm required üyelerin başlatıldığını denetlemesini devre dışı bırakır. Dikkatli kullanın.

Aşağıdaki kod, ve LastName özellikleri için değiştiriciyi required kullanan bir sınıf hiyerarşisini FirstName 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.