gpt4 book ai didi

c# - ReadonlySpan 作为属性

转载 作者:行者123 更新时间:2023-11-30 21:26:57 28 4
gpt4 key购买 nike

我尝试理解 .net core 3.0。据我所知,我不能将 Span 或 ReadonlySpan 用作属性或成员,因为它是基于堆栈的结构。我想知道以下定义之间的区别。我可以成功定义“part1”而不会出现任何错误。我收到了第 2 部分的以下编译错误“在此上下文中不能使用 Span 类型的 stackalloc 表达式的结果”对于第 3 部分,我收到了不同的编译错误。“字段或自动实现的属性不能是 ReadonlySpan 类型”

public class KeyGenWithSpan
{
private static ReadOnlySpan<char> part1 => new[] { 'p', '1'};
private static ReadOnlySpan<char> part2 => stackalloc[]{'1','2'};
private static ReadOnlySpan<char> part3 = stackalloc[]{'1','2'};
}

最佳答案

span 是一个基于堆栈的结构,但数据 可以在任何地方。它可以在数组中,可以是非托管内存,可以是堆栈,可以是“固定缓冲区”,也可以是字符串等。

可以将跨度作为属性。您不能拥有的是作为字段 的跨度,ref struct 类型除外。该属性将作为一个代理从某些东西(可能是一个数组)中获取跨度。

第 1 部分中,您每次都分配一个新数组,但这不是必需的 - 它可以做得更聪明。

然而,这对 stackalloc 来说是不可能的,因为 stackalloc 会在属性 getter 的栈帧中分配 ,当你退出 getter。

考虑:

private static readonly char[] s_data = { 'p', '1'};
public static ReadOnlySpan<char> Data => s_data; // perfectly valid conversion

请注意,对于某些类型(特别是:不是char),编译器可以在这里做额外的巫术:

public static ReadOnlySpan<byte> Data2 => new byte[] { 0, 1 };

不会每次在 getter 中编译成一个新的数组;相反,它直接从程序集元数据中提取:

.method public hidebysig specialname static valuetype [System.Runtime]System.ReadOnlySpan`1<uint8> get_Data2() cil managed
{
.maxstack 8
L_0000: ldsflda int16 <PrivateImplementationDetails>::3F29546453678B855931C174A97D6C0894B8F546
L_0005: ldc.i4.2
L_0006: newobj instance void [System.Runtime]System.ReadOnlySpan`1<uint8>::.ctor(void*, int32)
L_000b: ret
}

关于c# - ReadonlySpan 作为属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58518024/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com