【发布时间】:2020-08-08 20:36:40
【问题描述】:
我知道在 C# 中,我们总是可以使用Array.Copy() 方法获取给定数组的子数组。但是,这将消耗更多的内存和处理时间,这在只读情况下是不必要的。例如,我正在编写一个负载很重的网络程序,它会非常频繁地与集群中的其他节点交换消息。每条消息的前 20 个字节是消息头,其余字节组成消息体。因此,我将接收到的原始消息分为头字节数组和正文字节数组,以便分别处理。但是,这显然会消耗双倍的内存和额外的时间。在 C 中,我们可以轻松地使用指针并为其分配偏移量来访问数组的不同部分。
例如,在 C 语言中,如果我们有一个char a[] = "ABCDEFGHIJKLMN",我们可以声明一个char* ptr = a + 3 来表示数组DEFGHIJKLMN。
有没有办法在 C# 中实现这一点?
【问题讨论】:
-
可能对
unsafe感兴趣。得到一个可枚举的投影很容易,但不是另一个“没有副本”的数组。 -
“但是,这显然会消耗双倍内存” 我不明白为什么,除非你在内存中保留两个副本。将其拆分后,将原始的设置为 null 或让它超出范围。
-
查看 LINQ 的 Skip() 和 Take() 扩展方法。不用担心数组本身,学习使用 IEnumerable。
-
您可以定义自己的小类型来包装目标数组+偏移量,并通过添加偏移量的数组访问。
-
unsafe或创建自己的数组,不复制实例只是引用它们。
标签: c#