隐藏c#中不安全的代码行为

时间:2014-04-16 17:13:35

标签: c# unsafe

最近我写了一些树,想尝试不安全的代码。最后,我做的都没有不安全,但在这段代码中找到了一些模糊(对我而言)的地方(对于更短的代码,我删除了所有逻辑,因此所有代码看起来都毫无意义):

public static void Main() {
        EqClass a = new EqClass();
        a.AddElement(2, new record(3)); // *place1*
                    ...
            }
    unsafe struct node {
        public node* next;
        public record Value;
        public node(record value) {
            this = new node();
            this.Value = value;
        }
    }
    struct record {
        public int a;
        public record(int a) {
            this.a = a;
        }
    }
    unsafe class EqClass {
        node*[] last = new node*[3];
        public void AddElement(int classIndex, record element) {
            node a = new node(element);
            node* newNode = &a;
            last[classIndex]->next = newNode; // *place2*
        }
    }

place2 中一切都可以,但是当方法AddElement结束时,在最后[2](放置元素的地方)意外地出现了一些垃圾。但为什么?提前谢谢。

1 个答案:

答案 0 :(得分:6)

这是 unsafe*的用途。说真的:不要这样做。你在这里做的基本上是参考。为此:使用class,而不是struct。否则这对你非常非常伤害。

另外:这不是struct的用途。看一下像这样的可变struct在瞬间告诉我你并不欣赏struct打算做什么。

如果您想知道无意义值的来源:指针不是固定位置。对此的解决不是“哦,所以我需要固定它们”。它是“使用引用,而不是指针”。

相关问题