c# - 如何获得子数组而不进行克隆

标签 c#

我知道在C#中,我们总是可以使用Array.Copy()方法获取给定数组的子数组。但是,这将消耗更多的内存和处理时间,这在只读情况下是不必要的。例如,我正在编写一个负载很大的网络程序,该程序非常频繁地与集群中的其他节点交换消息。每个消息的前20个字节是消息头,其余字节组成消息正文。因此,我将接收到的原始消息分为头字节数组和正文字节数组,以便分别处理它们。但是,这显然会消耗双倍的内存和额外的时间。在C语言中,我们可以轻松地使用指针并为其分配偏移量,以访问数组的不同部分。
例如,在C语言中,如果我们有char a[] = "ABCDEFGHIJKLMN",则可以声明一个char* ptr = a + 3来表示数组DEFGHIJKLMN

有没有办法在C#中做到这一点?

最佳答案

您可能对 ArraySegments unsafe 感兴趣。
ArraySegments界定一维数组的一部分。

Check ArraySegments in action

ArraySegments用法示例:

 int[] array = { 10, 20, 30 };

 ArraySegment<int> segment = new ArraySegment<int>(array, 1, 2);
 // The segment contains offset = 1, count = 2 and range = { 20, 30 }
Unsafe定义了在其中可以使用指针的不安全上下文。

不安全用法示例:
    int[] a = { 4, 5, 6, 7, 8 };

    unsafe
    {
        fixed (int* c = a)
        {
            // use the pointer
        }
    }

关于c# - 如何获得子数组而不进行克隆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61422469/

相关文章:

c# - 正则表达式匹配从头开始

c# - Winforms 中应用程序范围组件应该放在哪里?

c# - 更改动态组合框中组合框项的文本样式

c# - 是否有理由先转换为一个类型然后再转换为可空类型?

c# - 使用拆分字符串中的值填充类变量

c# - 这两个片段严格等效吗?

c# - 为什么这种线程化方法不起作用?

c# - 如果我的应用程序中需要有 60 个图像控件,我是否必须有 60 个这样巨大的代码块?

c# - ASP.NET 保存复杂的实体模型

c# - 使 dapper SQL 语法着色