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

标签 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 报错如下:

Error CS0208: Can not take the address of a managed type ('MazeGen.Node'), get the size of, or declare a pointer to it

当我将 (Node* n) 传递给构造函数时,第 16 行和第 21 列出现相同的错误

我如何声明一个指向MazeGen.Node 类型对象的指针的单维数组?

感谢您抽出宝贵时间。

最佳答案

C# 中的类完全由 CLR 管理,包括它们的内存分配、指针等。它们并非直接设计为用作指针。

当你声明一个类类型的变量时,在幕后,它实际上是一个指针(某种程度上),因为你确实持有对数据的引用,它确实存在于堆中,你总是传递该引用在方法参数中,但它只是将指针传递给同一 block 数据。这就是类被称为“引用类型”的原因。

与此相反,任何结构类型的变量都存储在您声明它的位置,您拥有数据本身,而不是对其他内容的引用。它们存在于局部变量的堆栈中,当它们是类的字段时,它们只是堆中对象的一部分。 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 是引用类型(因为它是 class ),该列表将包含一个自动管理的引用数组,指向额外的节点。

关于c# - 创建指向自定义类的指针(由我自己创建),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21953888/

相关文章:

c# - 更新列表中的子项目会更新 C# 中的所有项目

javascript - 从 Internet Explorer 中的单击事件中的 div 获取类

java - java中的成员嵌套类?

C 为双指针赋值

c++ - 为什么不能用另一个指向 const char 的指针来初始化一个指针?

c - C 中的 typedef 和指向函数的指针

c# - Twilio API 请求限制/限制?

c# - 如何使用 C# 使用 Sharpsvn 客户端读取文件

c# - 在 C# 中显示和隐藏 div 不起作用

eclipse - 检查java代码中的回文