gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:35:49 25 4
gpt4 key购买 nike

代码如下:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com