在C#中不能将指针数组放在不安全的结构中的根本原因是什么?

con*_*ons 6 c# struct pointers unsafe d

如果可以将一个指向数组的指针放在C#中的不安全结构中的子结构中,就像在C中一样,构建复杂的数据结构而不会产生每个节点有一个对象的开销,这样会更容易,而且时间更少,以及语法更清晰,更易读.

是否有一个深层的架构原因,为什么不安全的结构中的固定数组只允许由"值类型"而不是指针组成?

我假设只有在结构中明确命名指针必须是故意削弱语言的决定,但我找不到任何关于为什么会这样的文档,或者不允许指针数组在结构中的原因,因为我会假设垃圾收藏家不应该关心被标记为不安全的结构.

数字火星'D优雅地处理结构和指针,我发现我无法快速开发简洁的数据结构; 通过在C#中引用抽象,很多功能似乎已从语言中删除,即使指针至少仍然存在于营销意义上.

也许我错误地期望语言随着时间的推移有效地表示复杂的数据结构.

Mar*_*ner 2

我只是猜测,但这可能与不同目标平台的不同指针大小有关。看来 C# 编译器直接使用元素的大小进行索引计算(即没有 CLR 支持计算固定大小的缓冲区索引...)

无论如何,您可以使用 s 数组ulong并将指针强制转换为它:

unsafe struct s1
{
  public int a;
  public int b;
}

unsafe struct s
{
  public fixed ulong otherStruct[100];
}

unsafe void f() {
  var S = new s();
  var S1 = new s1();
  S.otherStruct[4] = (ulong)&S1;
  var S2 = (s1*)S.otherStruct[4];
}
Run Code Online (Sandbox Code Playgroud)