closed (C# Başvurusu)

C# 15'den başlayarak, kapalı hiyerarşi bildirmek için değiştiriciyi bir sınıfa uygulayabilirsinizclosed. Yalnızca bildirim derlemesi içindeki kapalı bir sınıftan doğrudan bir alt tür türetebilirsiniz. Doğrudan alt öğeler kümesi sabit olduğundan, her doğrudan alt öğeyi işleyen bir switch ifade kapalı taban türünü tüketer ve varsayılan bir kol gerekmez.

// Assembly 1
public closed record class JobStatus;
public record class Queued : JobStatus;
public record class Running(int PercentComplete) : JobStatus;
public record class Completed(TimeSpan Elapsed) : JobStatus;
public record class Failed(string Error) : JobStatus;

// Assembly 2
public record class Paused : JobStatus; // Error: 'JobStatus' is a closed class

Aynı derleme kısıtlaması yalnızca kapalı sınıfın doğrudan alt öğeleri için geçerlidir. Kapalı bir sınıftan türetilen bir sınıf, siz işaretlemediğiniz closedsürece kapalı değildir. Failed Önceki örnekte düz bir kayıt olduğundan, başka bir derleme bundan türetilebilir:

// Assembly 2
public record class RetryableFailed(string Error, int Attempts) : Failed(Error); // OK: 'Failed' isn't sealed or closed

Türetme işlemini de Failed engellemek istiyorsanız, veya closedolarak sealed bildirin.

C# dili başvuru belgesi, C# dilinin en son yayımlanan sürümünü gösterir. Ayrıca, yaklaşan dil sürümü için genel önizlemelerdeki özelliklere yönelik ilk belgeleri içerir.

Belgelerde ilk olarak dilin son üç sürümünde veya geçerli genel önizlemelerde sunulan tüm özellikler tanımlanır.

Tip

Bir özelliğin C# dilinde ilk tanıtıldığı zamanları bulmak için C# dil sürümü geçmişi makalesine bakın.

Note

closed bağlamsal bir anahtar sözcüktür. Yalnızca sınıf bildiriminde değiştirici olarak göründüğünde özel bir anlamı vardır. Diğer bağlamlarda tanımlayıcı olarak kullanmaya closed devam edebilirsiniz. Değiştiricinin de geçerli olacağı bir konumda tanımlayıcı olarak kullanmanız closed gerekiyorsa, derleyiciye değiştirici yerine tanımlayıcı olarak davranmasını bildirmek için bu tanımlayıcıya (örneğin, @closed) ön ekini @ ekleyin.

Bildirim kuralları

Değiştirici closed bir sınıf değiştiricidir:

  • Bir closed sınıf örtük olarak abstractşeklindedir. , staticveya açık abstract değiştirici ile sealedbirleştiremezsinizclosed.
  • Kapalı bir sınıfın doğrudan alt türünü, kapalı temel sınıfla aynı derlemede ve modülde bildirmeniz gerekir.
  • Kapalı bir sınıftan türetilen bir sınıf kendisi kapalı değildir. Türetilmiş bir sınıfın closed da kapatılmasını istiyorsanız değiştiriciyi yeniden uygulayın.

Genel bir sınıf doğrudan bir closed sınıftan türetilirse, türetilen sınıftaki her tür parametresi temel sınıf belirtiminde kullanılmalıdır. Bu kural değiştiricinin closed kendisiyle ilgili değildir: kapalı oluşturulan tür, türü bağımsız değişkenleri gibi Tree<T>açık bir türün aksine tam olarak belirtilen genel bir türdür (örneğinTree<int>). Kural, temel sınıfın her kapalı oluşturulmuş türünün doğrudan alt öğeleri arasında tam olarak bir karşılık gelen kapalı yapılandırılmış türe sahip olmasını sağlar, böylece derleyici kapsamlılık hakkında neden olabilir.

public closed record class Tree<T>;

public record class Leaf<T>(T Value) : Tree<T>;                       // OK: 'T' appears in the base class
public record class Branch<T>(Tree<T> Left, Tree<T> Right) : Tree<T>; // OK: 'T' appears in the base class
public record class Constant<U>(U Value) : Tree<int> { } // Error: 'U' isn't used in the base class

Kapsamlı anahtar ifadeleri

Bir switch ifade kapalı sınıfın her doğrudan alt öğesini işlediğinde, derleyici anahtarı kapsamlı olarak değerlendirir ve kapsamlı olmayan bir uyarı oluşturmaz:

public static string Describe(JobStatus status) => status switch
{
    Queued => "waiting to start",
    Running(var percent) => $"{percent}% complete",
    Completed(var elapsed) => $"finished in {elapsed.TotalSeconds:F1}s",
    Failed(var error) => $"failed: {error}",
    // No warning: every direct descendant of 'JobStatus' is handled.
};

Anahtar idaresi ifadesi null atanabilir olduğunda, null anahtarın işlemesi gereken başka bir olası değer olur. Bir geçiş yalnızca JobStatus? şunları da kapladığında nullkapsamlıdır:

public static string DescribeOrUnknown(JobStatus? status) => status switch
{
    null => "unknown",
    Queued => "waiting to start",
    Running(var percent) => $"{percent}% complete",
    Completed(var elapsed) => $"finished in {elapsed.TotalSeconds:F1}s",
    Failed(var error) => $"failed: {error}",
    // No warning: every direct descendant of 'JobStatus' is handled, and null is handled.
};

Kolu atlarsanız null , derleyici desenin null işlenmediğini uyarır. Aynı kural, kapalı türün bir sınıf mı yoksa null atanabilir bir türe kaldırılmış bir yapı mı olduğunu belirler.

Derleyicinin, kapalı hiyerarşilerin genel kısıtlamalar ve erişilebilirlikle nasıl etkileşimde bulunduğu da dahil olmak üzere kapsamlılığı nasıl belirlediğini hakkında daha fazla bilgi için bkz. Kapalı hiyerarşi desenleri.

Kapalı bir türle kısıtlanmış tür parametreleri

Kapalı bir sınıfla kısıtlanmış bir tür parametresi, kapsamlı denetimler için kapalı sınıf olarak kabul edilir. switch İdare değeri böyle bir tür parametresine sahip olan bir ifade, kapalı kısıtlamanın her doğrudan alt öğesini işlediğinde çok kapsamlıdır:

public static string DescribeJob<X>(X status) where X : JobStatus => status switch
{
    Queued => "waiting to start",
    Running(var percent) => $"{percent}% complete",
    Completed(var elapsed) => $"finished in {elapsed.TotalSeconds:F1}s",
    Failed(var error) => $"failed: {error}",
    // No warning: 'X' is constrained to a closed type, so its direct descendants exhaust the switch.
};

Bu kural, tür parametresinin bir yöntemde mi yoksa içeren türde mi görüntülenip görüntülenmeyeceğini uygular.

C# dil belirtimi

Daha fazla bilgi için bkz. Kapalı hiyerarşiler özellik belirtimi.

Ayrıca bakınız