代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MazeGen
{
unsafe class Node
{
bool visited = false;
int linksNumber = 0;
Node*[] links;
public Node(Node* n)
{
visited = true;
linksNumber++;
links[0] = n;
}
}
}
Visual Studio的错误如下:
错误CS0208:无法获取托管类型的地址 ( 'MazeGen.Node'), 获取大小,或声明指向它的指针
当我将(Node* n)
传递给构造函数时,我在第16行和第21列有相同的错误
如何声明指向MazeGen.Node
类型对象的单维指针数组?
谢谢你的时间差异很大。
答案 0 :(得分:4)
C#中的类完全由CLR,它们的内存分配,指针等管理。它们不是直接设计用作指针的。
当你声明一个类类型的变量时,它实际上是一个指针(某种类型),因为你真的拥有对数据的引用,它实际上存在于堆中,你总是传递那个引用在方法参数中,但它只是传递指向同一条数据的指针。这就是为什么类被称为“引用类型”。
与此相反,任何结构类型的变量都存储在您声明它的位置,您拥有数据本身,而不是对其他内容的引用。它们存在于堆栈中以获取局部变量,并且当它们是类的字段时,它们作为堆中对象的一部分。 CLR允许使用并传递指向结构的指针,前提是您将包含体声明为unsafe
,并且像C ++一样工作。
通常,建议仅在与使用指针的非托管代码进行交互时使用unsafe
,因为如果不小心,则会丢失.NET的内存管理功能及其类型安全性。而且,在你的程序中,除非它比发布的代码片段更多,否则没有理由使用它,因为正常的.NET类可以很容易地实现相同的结果:
public class Node
{
public bool Visited {get; set;}
public int LinksNumber {get; set;}
IList<Node> Links {get; private set;}
public Node(Node n)
{
Visited = true;
LinksNumber = 1;
Links = new List<Node>() {n};
}
}
这实现了相同的结果(看起来几乎是树状结构),但使用内置的List<T>
类来保存对链接节点的引用。由于Node是一种refence类型(因为它是class
),因此该列表将保存一个自动管理的额外节点引用数组。