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.
Not
Bu makale bir özellik belirtimidir. Belirtim, özelliğin tasarım belgesi olarak görev alır. Önerilen belirtim değişikliklerini ve özelliğin tasarımı ve geliştirilmesi sırasında gereken bilgileri içerir. Bu makaleler, önerilen belirtim değişiklikleri son haline getirilene ve geçerli ECMA belirtimine dahil edilene kadar yayımlanır.
Özellik belirtimi ile tamamlanan uygulama arasında bazı tutarsızlıklar olabilir. Bu farklılıklar, ilgili dil tasarım toplantısı (LDM) notlarındabelirtilmiştir.
Özellik belirtimlerini C# dil standardına benimseme işlemi hakkında daha fazla bilgi edinmek için belirtimleri makalesinde bulabilirsiniz.
Şampiyon sorunu: https://github.com/dotnet/csharplang/issues/3435
Özet
Diziyi veya bir listeyi desen dizisiyle eşleştirmenizi sağlar; örneğin, array is [1, 2, 3] sırasıyla öğeleri 1, 2, 3 olan üç uzunluğundaki bir tamsayı dizisiyle eşleşir.
Ayrıntılı tasarım
Desen söz dizimi aşağıdaki gibi değiştirilir:
list_pattern_clause
: '[' (pattern (',' pattern)* ','?)? ']'
;
list_pattern
: list_pattern_clause simple_designation?
;
slice_pattern
: '..' pattern?
;
primary_pattern
: list_pattern
| slice_pattern
| // all of the pattern forms previously defined
;
İki yeni desen vardır:
- list_pattern öğeleri eşleştirmek için kullanılır.
- slice_pattern, yalnızca bir kez ve sadece doğrudan bir list_pattern_clause içinde izin verilir ve sıfır veya daha fazlaöğeyiatar.
Desen uyumluluğu
list_pattern, sayılabilir ve dizinlenebilir olan herhangi bir türle uyumludur; bağımsız değişken olarak Index kabul eden bir erişilebilir dizin oluşturucusu veya tek bir int parametresine sahip başka bir erişilebilir dizin oluşturucusu vardır. Her iki dizin oluşturucu da varsa, ilki tercih edilir.
Alt slice_pattern, sayılabilir ve dilimlenebilir her türle uyumludur; bağımsız değişken olarak Range alan erişilebilir bir dizin oluşturucuya veya iki int parametresi olan erişilebilir bir Slice yöntemine sahiptir. Her ikisi de varsa, ilk tercih edilir.
Bir alt desen içermeyen bir slice_pattern, list_patternile uyumlu olan herhangi bir türle uyumludur.
Bu kural kümesi,aralık dizin oluşturucu deseninden türetilir.
Subsumption kontrolü
Subsumption denetimi, ITuple konumsal desenler gibi çalışır. Buna karşılık gelen alt modeller konum ve test uzunluğu için ek bir düğüme göre eşleştirilir.
Örneğin, her iki desen de aynı DAG'yi sağladığından aşağıdaki kod bir hata oluşturur:
case [_, .., 1]: // expr.Length is >= 2 && expr[^1] is 1
case [.., _, 1]: // expr.Length is >= 2 && expr[^1] is 1
Aksine:
case [_, 1, ..]: // expr.Length is >= 2 && expr[1] is 1
case [.., 1, _]: // expr.Length is >= 2 && expr[^2] is 1
Çalışma zamanında alt desenlerin eşleşme sırası belirtilmemiştir ve başarısız bir eşleşme durumunda tüm alt desenler eşleştirmeye çalışmayabilir.
Belirli bir uzunluk göz önüne alındığında, iki alt desenin aynı öğeye başvurması mümkündür; bu durumda, karar ağacına bu değere yönelik bir test eklenir.
- Örneğin,
[_, >0, ..] or [.., <=0, _], 3 uzunluk değerinin diğer teste işaret ettiğilength >= 2 && ([1] > 0 || length == 3 || [^2] <= 0)olur. - Buna karşılık, 3 uzunluk değeriyle diğer teste izin vermeyen
[_, >0, ..] and [.., <=0, _],length >= 2 && [1] > 0 && length != 3 && [^2] <= 0olur.
Sonuç olarak, örneğin case [.., p]: case [p]: gibi bir şey için bir hata oluşturulur çünkü çalışma zamanında aynı öğeyi ikinci durumda eşleştiriyoruz.
Dilimli bir alt desen bir liste veya uzunluk değeriyle eşleşiyorsa, alt desenler, içeren listenin doğrudan alt deseni olarak ele alınır. Örneğin, [..[1, 2, 3]], [1, 2, 3]formundaki bir deseni içerir.
Kullanılan üyeler üzerinde aşağıdaki varsayımlar yapılır:
- türü sayılabilir yapan özelliğin, yalnızca ve yalnızca türü dizinlenebilirise her zaman negatif olmayan bir değer döndüreceği varsayılır. Örneğin, desen
{ Length: -1 }hiçbir zaman bir diziyle eşleşmez. - Tür dilimlenebilir yapan üyenin iyi davrandığı varsayılır, yani dönüş değeri hiçbir zaman null değildir ve içeren listenin uygun bir alt dilimidir.
Yukarıdaki varsayımlardan herhangi biri tutmazsa, desen eşleştirme işleminin davranışı tanımlanmamıştır.
Düşürme
Form expr is [1, 2, 3] deseni aşağıdaki koda eşdeğerdir:
expr.Length is 3
&& expr[new Index(0, fromEnd: false)] is 1
&& expr[new Index(1, fromEnd: false)] is 2
&& expr[new Index(2, fromEnd: false)] is 3
Bir slice_pattern, uygun bir ihmal gibi davranır; yani, bu tür bir desen için herhangi bir test oluşturulmaz, sadece diğer düğümleri, yani uzunluk ve indeksleyiciyi etkiler. Örneğin, form expr is [1, .. var s, 3] deseni aşağıdaki koda eşdeğerdir (açık Index ve Range desteğiyle uyumluysa):
expr.Length is >= 2
&& expr[new Index(0, fromEnd: false)] is 1
&& expr[new Range(new Index(1, fromEnd: false), new Index(1, fromEnd: true))] is var s
&& expr[new Index(1, fromEnd: true)] is 3
slice_pattern için giriş tipi, temel alınan this[Range] veya Slice metodunun dönüş türüdür ve iki istisna vardır: string ve diziler için sırasıyla string.Substring ve RuntimeHelpers.GetSubArray kullanılacaktır.
Çözülmemiş sorular
- Çok boyutlu dizileri desteklemeli miyiz? (yanıt [LDM 2021-05-26]: Desteklenmiyor. Genel bir MD dizi odaklı sürüm yapmayı planlıyorsak, sadece liste kalıplarını değil, şu anda eksik oldukları tüm alanları tekrar ele almak isteriz.)
-
..'yi izleyen bir slice_patterniçinde genel bir deseni kabul etmeli miyiz? (yanıt [LDM 2021-05-26]: Evet, bir dilimden sonra herhangi bir desene izin verilir.) - Bu tanıma göre, desen
[..],expr.Length >= 0'i test eder.Lengthher zaman negatif olmadığını varsayarak bu testi atlasak mı? (yanıt [LDM 2021-05-26]:[..]Uzunluk denetimi göstermeyecek)
C# feature specifications