C#中的结构指针初始化

时间:2011-12-31 10:14:04

标签: c# pointers struct unsafe

unsafe public class Temp
{
    public struct Node
    {
        Node *left;
        Node *right;
        int value;
    }

    public Temp()
    {
        Node* T=new Node();
        T->left=null;
        T->right=null;
        T->value=10;
    }
}

main()
{
    Temp temp=new Temp();
}

它给出了Object引用未设置为对象实例的错误。当我想制作AVL树程序(我在C ++中创建并测试但在C#中复制时出错)时,我该怎么办?

3 个答案:

答案 0 :(得分:17)

不要尝试像这样在C#中使用指针。如果要移植使用指针作为引用的C ++代码,请使用引用类型。你的代码根本不起作用; “new”不会从堆中分配结构,一方面,即使它确实指针需要在C#中固定; C#是一种垃圾收集语言。

简而言之永远不要使用unsafe,除非您完全了解C#中有关内存管理的所有内容。您正在关闭那里的安全系统以保护您,因此您必须知道该安全系统的作用。

代码应为:

public class Temp // safe, not unsafe
{
    public class Node // class, not struct
    {
        public Node Left { get; set; } // properties, not fields
        public Node Right { get; set; } 
        public int Value { get; set; }
    }

    public Temp()
    {
        Node node = new Node();
        node.Left = null; // member access dots, not pointer-access arrows
        node.Right = null;
        node.Value = 10;
    }
}

答案 1 :(得分:4)

问题出在以下几行:

Node* T=new Node();

在C#中,new Node()返回Node(引用),而不是Node*(指针)。 您应该使用stackalloc代替。

无论如何,请不要复制C ++并以C#方式进行!

答案 2 :(得分:2)

您不能将.NET变量分配给只能获取其地址的指针。如果您没有引用new ed Node,它会立即收集垃圾,因此您可能遇到了“未设置对象引用”。然而,像Node* T = new Node()这样的表达式不应该编译,因为它有效地尝试进行无效的类型转换。

您要做的是错误的:不要将C ++代码复制并粘贴到C#,这是无稽之谈。如果您已经测试过C ++组件,则使用.NET /非托管互操作来编组两个世界之间的数据,尽管我不建议在这个抽象级别上执行此操作。如果您正在进行练习,请仅在.NET世界中实现AVL树,否则使用其中一个具有等效功能的框架集合,例如SortedSetSortedDictionary ...