c# - 跨度 - 访问原始值
问题描述
我希望获得 Span 代表的原始值。以下面的代码为例,我如何在不创建副本的情况下DoWork
访问原始字节数组?
static void Main()
{
var data = new byte[0x100];
DoWork(new Span<byte>(data));
}
private void DoWork(Span<byte> Data)
{
//var data = Data.ToArray(); Unsuitable; creates a copy
//var data = (byte[])Data; Unsuitable; doesn't work
//MemoryMarshal. Something in here may work, but unsure
//MemoryExtensions. Something in here may work, but unsure
}
我发现 2 个带有辅助方法的静态类(如上所示)可能会有所帮助,但我不确定在不使事情变得比复制更慢的情况下最好的方法是什么。
解决方案
根据跨度文件:
因为它是仅栈类型,所以 Span 不适用于许多需要在堆上存储对缓冲区的引用的场景。例如,对于进行异步方法调用的例程来说,情况就是如此。对于这种情况,您可以使用免费的 System.Memory 和 System.ReadOnlyMemory 类型。
因此,也许根据您的需要,您不必使用 Span:
static void Main()
{
var data = new byte[0x100];
DoWork(data);
}
private void DoWork(byte[] data)
{
// data array is by reference.
}
推荐阅读
- python - 正则表达式输出到文本文件
- python - Keras 教程错误:NameError:未定义名称“层”
- javascript - 是否可以在Javascript中禁用功能window.open
- php - 有没有更快的方法来发现存储的断开链接?
- django - 管理员外的 Django 管理页面
- python - 用于累积数字和打印名称的嵌套 for 循环
- elasticsearch - 如何在 Elasticsearch 中为 Java ArrayList 创建索引映射
- php - 如何使用谷歌分析跟踪动态创建的子目录?
- java - 使用带有标头的 REST 客户端时获取 ssl.SSLHandshakeException 但与 PostMan 一起工作正常
- unity3d - Unity 代码在编辑器中有效,但不适用于 Build (EXE File) C#