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#中复制时出错)时,我该怎么办?
答案 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树,否则使用其中一个具有等效功能的框架集合,例如SortedSet
或SortedDictionary
...