【发布时间】:2019-01-31 16:53:11
【问题描述】:
随着 C#7.2 的发布,出现了 in parameter modifier 和 Span<T> struct。 Span 现在已经在 .NET Core 周围泛滥 API。还发布了一个 .NET Standard API (System.Memory),可以使用 Span<T>、ReadOnlySpan<T> 等。
System.Memory API 的一部分是这些切片类型as seen here 的扩展方法。
问题是,为什么这些扩展方法不使用跨度的in 参数修饰符来实现?由于Span<T> 和ReadOnlySpan<T> 是ref readonly struct 类型,这些方法似乎会导致运行时创建传递给这些方法的跨度的防御性副本。我知道这个副本相对便宜,但似乎会看到小的性能提升。
这些扩展方法的一些 .NET Core 实现是located here。
为了澄清,我期待这样的方法签名:
public static int IndexOf<T>(this in System.Span<T> span, T value) where T : System.IEquatable<T>
public static System.ReadOnlySpan<char> Trim(this in System.ReadOnlySpan<char> span)
public static bool IsWhiteSpace(this in System.ReadOnlySpan<char> span)
【问题讨论】: