Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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
closedsınıf örtük olarakabstractşeklindedir. ,staticveya açıkabstractdeğiştirici ilesealedbirleş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
closedda 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.