string. asspan()阻止字符串分配吗?



我正在构建一个自定义的JsonConverter,我想知道AsSpan()的行为。

public override int Read(ref Utf8JsonReader reader, Type type, JsonSerializerOptions options)
{
return int.TryParse(Encoding.UTF8.GetString(reader.ValueSpan).AsSpan(),
System.Globalization.NumberStyles.Integer | System.Globalization.NumberStyles.AllowThousands,
System.Globalization.CultureInfo.InvariantCulture,
out int value) ? value : default;
}

既然Encoding.Utf8.GetString(…)返回一个字符串,那么AsSpan()被调用,这是否意味着首先在堆上分配一个字符串,然后从它构建一个跨度?或者AsSpan()方法"block "将字符串分配并直接使其成为span ?

谢谢你的澄清

您将在GetString中分配string。让我们看看GetString的来源——它叫CreateStringFromEncoding。然后CreateStringFromEncoding调用实际分配内存的FastAllocateString(见这里)

因此,基于span的GetString能够防止为输入数据创建和分配中间字节数组,以防您在其他一些表示(例如,作为int数组或其他东西)中有这样的数据,但不阻止分配输出字符串对象。

AsSpan调用不会以任何方式影响GetString,在这个特殊的情况下,int.Parse是完全无用的,因为int.Parse已经重载了string

相关内容

  • 没有找到相关文章

最新更新