创建指向自定义类的指针(由我自己创建)

时间:2014-02-22 11:49:04

标签: c# class pointers

代码如下:

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类型对象的单维指针数组?

谢谢你的时间差异很大。

1 个答案:

答案 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),因此该列表将保存一个自动管理的额外节点引用数组。