这个C#结构有什么问题?

Bob*_*Bob 3 c# struct cycle

注意:我的问题有几个部分.如果您愿意回答每个问题,我会很感激,而不是简单地告诉我该怎么做才能编译.:)

我对C#没有任何好处.事实上,我不太了解它的原因是我的课程专注于制作有效的算法,而不是真正教我们.NET.尽管如此,我们所有的程序都必须用.NET编写,直到现在才出现问题.我有以下代码,但它不会编译,我不明白为什么.我有一种直觉,认为这应该完全改写,但在我这样做之前,我想知道为什么不允许这样做.

结构的要点是创建一个类似结构的链表,这样我就可以在"列表"的末尾添加另一个节点,然后以相反的顺序遍历和调用节点

private struct BackPointer
{
    public BackPointer previous;
    public string a;
    public string b;
    public BackPointer(BackPointer p, string aa, string bb)
    {
        previous = p;
        a = aa;
        b = bb;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在我的代码中我有一些效果

BackPointer pointer = new BackPointer();
pointer = new BackPointer(pointer, somestring_a, somestring_b);
Run Code Online (Sandbox Code Playgroud)

我得到的编译错误是 Struct member 'MyClass.BackPointer.previous' of type 'MyClass.BackPointer' causes a cycle in the struct layout

这似乎是一个明显的错误.它不喜欢我在同一结构的构造函数中传递结构的事实.但为什么不允许这样做?我想这个代码只会在列表中创建一个新节点并返回该节点,并返回前一个节点,但显然不会发生这种情况.那么实际会发生什么呢?最后解决这个问题的推荐方法是什么?我想只是告诉它不受管理只是手动处理我的指针,但我真的只知道如何在C++中做到这一点.我真的不知道C#会出现什么问题

SLa*_*aks 10

那不是指针; 它是一个实际的嵌入struct值.
整点structs是,他们是(几乎)从来没有指针.

你应该用一个class代替.


Jon*_*eet 6

但为什么不允许这样做?

它是一个结构 - 一种价值类型.这意味着无论您拥有该类型的变量,该变量都包含结构中的所有字段,直接内联.如果某些东西包含自身(或创建一个更复杂的循环),那么你显然无法为它分配足够的空间 - 因为它必须有足够的空间用于其所有字段和另一个自身的副本.

最后解决这个问题的推荐方法是什么?

编写一个类而不是结构.然后变量的值将是对实例的引用,而不是数据本身.这就是你如何在C#中获得接近 "指针"的东西.(请注意,指针和参考文献不同.)

我建议你阅读我关于值类型和引用类型的文章以获取更多信息 - 这是在C#中理解的一个绝对重要的主题.