我正在构建一个自定义的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
。