2.9 KiB
Pattern match Span<char>
on a constant string
- Proposed
- Prototype: Completed
- Implementation: In Progress
- Specification: Not Started
Summary
Permit pattern matching a Span<char>
and a ReadOnlySpan<char>
on a constant string.
Motivation
For perfomance, usage of Span<char>
and ReadOnlySpan<char>
is preferred over string in many scenarios. The framework has added many new APIs to allow you to use ReadOnlySpan<char>
in place of a string
.
A common operation on strings is to use a switch to test if it is a particular value, and the compiler optimizes such a switch. However there is currently no way to do the same on a ReadOnlySpan<char>
efficiently, other than implementing the switch and the optimization manually.
In order to encourage adoption of ReadOnlySpan<char>
we allow pattern matching a ReadOnlySpan<char>
, on a constant string
, thus also allowing it to be used in a switch.
Detailed design
We alter the spec for constant patterns as follows (the proposed addition is shown in bold):
A constant pattern tests the value of an expression against a constant value. The constant may be any constant expression, such as a literal, the name of a declared
const
variable, or an enumeration constant, or atypeof
expression etc.If both e and c are of integral types, the pattern is considered matched if the result of the expression
e == c
istrue
.If e is of type
System.Span<char>
orSystem.ReadOnlySpan<char>
, and c is a constant string, and c does not have a constant value ofnull
, then the pattern is considered matching ifSystem.MemoryExtensions.SequenceEqual<char>(e, System.MemoryExtensions.AsSpan(c))
returnstrue
.Otherwise the pattern is considered matching if
object.Equals(e, c)
returnstrue
. In this case it is a compile-time error if the static type of e is not pattern compatible with the type of the constant.
System.Span<T>
and System.ReadOnlySpan<T>
are matched by name, must be ref struct
s, and can be defined outside corlib. System.MemoryExtensions
is matched by name and can be defined outside corlib. The signature of System.MemoryExtensions.SequenceEqual
must match public static bool SequenceEqual<T>(System.Span<T>, System.ReadOnlySpan<T>)
and public static bool SequenceEqual<T>(System.ReadOnlySpan<T>, System.ReadOnlySpan<T>)
respectively, and the signature of System.MemoryExtensions.AsSpan
must match public static System.ReadOnlySpan<char> AsSpan(string)
. Methods with optional parameters are excluded from consideration.
Drawbacks
None
Alternatives
None
Unresolved questions
None