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.
Sabit bir dizede desen eşleştirme
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
Özellik belirtimlerini C# dil standardına benimseme işlemi hakkında daha fazla bilgi edinmek için
Şampiyon sorunu: https://github.com/dotnet/csharplang/issues/8640
Özet
Bir sabit dizede Span<char> ve ReadOnlySpan<char> ile desen eşleştirmesine izin ver.
Motivasyon
Performans için, Span<char> ve ReadOnlySpan<char> kullanımı birçok senaryoda dize yerine tercih edilir. Çerçeve, ReadOnlySpan<char>yerine string kullanmanıza olanak sağlayan birçok yeni API ekledi.
Dizelerde yaygın bir işlem, belirli bir değer olup olmadığını test etmek için bir anahtar kullanmaktır ve derleyici böyle bir anahtarı iyileştirir. Ancak şu anda anahtarın ve optimizasyonun manuel olarak uygulanması dışında ReadOnlySpan<char> üzerinde aynı işlemi verimli bir şekilde gerçekleştirecek bir yol yoktur.
ReadOnlySpan<char> benimsenmesini teşvik etmek için, bir sabit ReadOnlySpan<char>üzerinde bir stringile desen eşleşmesine izin veririz, böylece switch ifadesinde kullanılmasına da olanak tanırız.
static bool Is123(ReadOnlySpan<char> s)
{
return s is "123";
}
static bool IsABC(Span<char> s)
{
return s switch { "ABC" => true, _ => false };
}
Ayrıntılı tasarım
Sabit desenler için belirtim aşağıdaki gibi değiştiririz (önerilen ekleme kalın olarak gösterilir):
edesen giriş değeri vePdönüştürülmüş değere sahip sabit desenvverildiğinde,
e tam sayı türüne veya numaralandırma türüne veya bunlardan birinin null atanabilir bir biçimine vev integral türüne sahipse,ifadesinin sonucu ise desen e değeriyle eşleşir; yoksa- e
System.Span<char>veyaSystem.ReadOnlySpan<char>türündeyse ve c sabit bir dizeyse ve c sabitnulldeğerine sahip değilse,System.MemoryExtensions.SequenceEqual<char>(e, System.MemoryExtensions.AsSpan(c))truedöndürürse desen eşleşen olarak kabul edilir.Pdesenideğerine e eşleşir, eğerobject.Equals(e, v)truedöndürürse.
İyi bilinen üyeler
System.Span<T> ve System.ReadOnlySpan<T> adıyla eşleştirilir, ref structolmalıdır ve corlib dışında tanımlanabilir.
System.MemoryExtensions isimle eşleştirilir ve corlib dışında tanımlanabilir.
System.MemoryExtensions.SequenceEqual aşırı yüklemelerinin imzası eşleşmelidir:
public static bool SequenceEqual<T>(System.Span<T>, System.ReadOnlySpan<T>)public static bool SequenceEqual<T>(System.ReadOnlySpan<T>, System.ReadOnlySpan<T>)
System.MemoryExtensions.AsSpan imzası belirtilen kriterle uyumlu olmalıdır.
public static System.ReadOnlySpan<char> AsSpan(string)
İsteğe bağlı parametreleri olan yöntemler dikkate alınmaz.
Dezavantaj -ları
Hiç kimse
Alternatif
Hiç kimse
Çözülmemiş sorular
Eşleştirmenin
MemoryExtensions.SequenceEqual()vb. bağımsız olarak tanımlanması gerekir mi?...
e.Length == c.Lengthiçindeki tüm karakterler içine[i] == c[i]veevarsa desenin eşleştiği kabul edilir.Öneri: Performans için
MemoryExtensions.SequenceEqual()temelinde tanımlayın.MemoryExtensionseksikse, derleme hatası bildirin.(string)nullile eşleştirmeye izin verilsin mi?Öyleyse,
(string)nullnedeniyle""MemoryExtensions.AsSpan(null) == MemoryExtensions.AsSpan("")'i altına almalı mı?static bool IsEmpty(ReadOnlySpan<char> span) { return span switch { (string)null => true, // ok? "" => true, // error: unreachable? _ => false, }; }Önerisi: Sabit desen
(string)nullhata olarak bildirilmelidir.Sabit desen eşleşmesi,
Span<char>veyaReadOnlySpan<char>için ifade değerinin çalışma zamanı türü testini içermeli mi?static bool Is123<T>(Span<T> s) { return s is "123"; // test for Span<char>? } static bool IsABC<T>(Span<T> s) { return s is Span<char> and "ABC"; // ok? } static bool IsEmptyString<T>(T t) where T : ref struct { return t is ""; // test for ReadOnlySpan<char>, Span<char>, string? }Tavsiye: Sabit desenler için örtük çalışma zamanı tipi testi yapılmamalıdır. ( tür testi açık olduğundan
IsABC<T>()örneğine izin verilir.)Bu öneri uygulanmadı. Yukarıdaki örneklerin tümü derleyici hatası oluşturur.
Kapsama sabit dize desenlerini, liste desenlerini ve
Lengthözellik desenlerini dikkate almalı mı?static int ToNum(ReadOnlySpan<char> s) { return s switch { { Length: 0 } => 0, "" => 1, // error: unreachable? ['A',..] => 2, "ABC" => 3, // error: unreachable? _ => 4, }; }Öneri: İfade değeri
stringolduğunda kullanılan aynı alt verme davranışı. (Bu, sabit dizeler, liste desenleri veLengtharasında,[..]'in her şeyle eşleştirilmesi dışında, herhangi bir kapsama girmeme durumu olduğu anlamına mı gelir?)
Tasarım toplantıları
C# feature specifications