C# 在C语言中是否可以使用基于堆栈的数组?

C# 在C语言中是否可以使用基于堆栈的数组?,c#,.net,arrays,stack,C#,.net,Arrays,Stack,比方说,假设阅读:我不认为我真的需要这个,但我很好奇这个想法突然出现在我的脑海中,一个人想要一个在堆栈上而不是堆上本地留出的内存数组。例如,类似这样的事情: private void someFunction() { int[20] stackArray; //C style; I know the size and it's set in stone } 我猜答案是否定的。我所能找到的只是基于堆的数组。如果有人需要这个,有什么解决办法吗?有没有办法以值类型的方式留出一定数量的顺序内存

比方说,假设阅读:我不认为我真的需要这个,但我很好奇这个想法突然出现在我的脑海中,一个人想要一个在堆栈上而不是堆上本地留出的内存数组。例如,类似这样的事情:

private void someFunction()
{
    int[20] stackArray; //C style; I know the size and it's set in stone
}
我猜答案是否定的。我所能找到的只是基于堆的数组。如果有人需要这个,有什么解决办法吗?有没有办法以值类型的方式留出一定数量的顺序内存?或者,与XNA中16个命名参数M11-M44的方式一样,具有命名参数的结构是唯一的方式吗?

您想要的是;不幸的是,您只能在不安全的代码中使用它,这意味着它不能在有限的权限上下文中运行


您还可以为每个元素类型创建一个结构,其中包含必要数量的变量,但是您需要为您想要使用的每个大小的“数组”创建一个新类型

我能想到的最接近基于堆栈的数组的东西是手动嵌套的结构;对于大小为N^M的数组,代码大小为OMN,访问时间为OM;可以方便地缩放M和N,例如,可以将4096元素数组处理为六个深嵌套的4元素结构、四个深嵌套的8元素结构或三个深嵌套的16元素结构、两个深嵌套的64元素结构,等等。如果要对16个元素的数组进行三次深度嵌套,最实际的折衷方法可能是定义一个包含字段f0到f15的16元素结构,以及使用switch/case选择元素的访问方法。然后我们可以定义其中的16个元素的结构,16个元素的结构,等等


一般来说,使用标准数组往往比使用值类型结构来模拟数组要好,但有时将数组作为值类型是有利的。然而,在.net中,值类型数组的优势往往会受到限制,因为它在处理通过引用操作值类型时存在一些限制。虽然通过写入MyArrayShiting[1][2][3]可以简单地从如上所述的数组中访问元素0x123会很好,但读写效率会很低,因为子表达式MyArrayShiting[1]会复制包含数组256个元素的结构。相反,需要通过引用一个例程来传递MyArrayShithing[1],该例程可以访问其中的元素2,并通过引用一个例程来传递MyArrayShithing[1]以访问其中的元素3。这样做是有可能的,但代码最终看起来相当糟糕。

Hm,那么一个原始的LinkedList呢?在您的结构集上,设置相同类型的上一个/下一个结构…您不会得到ICollection语义,但对于IEnumerable来说,这就足够了…谢谢您的回复。是的,是否可以使用基于结构的LinkedList?你知道为什么.NET中没有安全的基于堆栈的数组选项吗?@Frank:你不能这么做-当我尝试编译递归结构时,我得到了一个“CS0523:struct member导致结构布局中出现循环”@thecoop如果你让你的节点可以为Null呢?nullable仍然是一个结构,所以它不会工作。想想看——当你声明一个递归结构时,你基本上是在要求CLR为一个无限的结构列表分配空间。