我正在考虑实现一个异步函数返回一个结果结构,结果本身应该是不可变的,并且我正在考虑返回一个只读结构而不是类。
查看一些最新的Microsoft源代码,我可以看到只读结构被广泛使用,所以我的问题是这是否是正确的方法。从众多的文章来看,这是不清楚的,很多人指出,结构应该只用于小的大小值?因为结构将是只读的,据我所知,不会有复制?我的返回结构将有2-5 int值和对ReadOnlyMemory缓冲区的引用。
其目的当然是拥有最有效的低内存占用代码。
谢谢。
发布于 2020-09-14 07:53:02
当然,这是完全正确的。您似乎知道,struct
部件有助于避免某些分配,而readonly
部件避免了与可变值类型通常相关联的所有痛苦。作为回报,我甚至不会犹豫--没关系。作为“同步”方法的输入,您可能需要考虑添加in
修饰符,这样就不会不必要地在堆栈上复制大型值类型(否则会使值类型比引用类型更昂贵)。但是,在您的具体情况下,“异步”通常会成为in
使用的障碍(不能将in
和async
结合使用)。为了真正理解使用struct
是否使其更快,您需要对特定场景进行基准测试,因为细节非常重要。
您还可能需要了解async
代码中的分配方案。例如,您可能想要考虑ValueTask<T>
结果(而不是Task<T>
结果),如果结果通常是同步的(有时甚至是异步的),那么对其进行优化以避免状态机--状态机可以由这种方法总结。根据场景的不同,您还可能希望使用像PooledAwait
这样的工具(这在NuGet上是可用的)。
https://stackoverflow.com/questions/63879754
复制相似问题