【问题标题】:Cannot take the address of, get the size of, or declare a pointer ro a managed type无法获取托管类型的地址、大小或声明指向托管类型的指针
【发布时间】:2019-05-02 14:07:14
【问题描述】:

我正在尝试在 C# 中实现一个双链表,但我以前从未使用过指针并且找不到解决方案。 我正在尝试创建一个节点类,它将包含一个项目和指向相邻节点的指针。

// single elements in the list 
unsafe class Node { Node* previous}
{
    public int data;
    public Node *next;
    public Node *prev = *previous;
}

我不断收到标题中的错误,我不知道如何解决。

【问题讨论】:

  • 你不需要一个指针,你只需要一个对下一个/上一个节点的引用。我怀疑你练习的目的是使用带有指针的unsafe 代码。
  • 最近 Pluralsight 提示我做一个 C# 技能评估。前五个问题中有两个是关于unsafe 和指针。我认为这真的很奇怪,因为 - 并不是说​​我提倡不了解事物 - 我从来没有使用过这些东西,我怀疑我们中的许多人可以永远继续下去而不会遇到它,除了 ReSharper 中的 unsafe 之外-生成 GetHashCode 覆盖。

标签: c# pointers


【解决方案1】:

您根本不需要 unasnaged 指针或 unsafe。因为Node 是一个类,所以当您使用Node 作为参数、字段、变量等时 - 这是对Node 实例的引用reference 这里的意思是“托管指针” - 即像一个指针,但具有完整的 GC 支持和类型安全等。所以你只需要Node:

class Node
{
    public int Data {get;set;}
    public Node Next {get;set;}     // Next/Previous might want "private set" if
    public Node Previous {get;set;} // you are going to change them via methods
}

更具体地说,您不能轻易地将 unmanaged 指针指向 C# 中的 class - Node* - 这根本不是一回事你可以这样做。你可以用struct 做到这一点,但是:你几乎肯定不应该。我希望这里的重点是使用 managed 指针,也就是引用,即Node,而不是Node*

【讨论】:

    【解决方案2】:

    正如 CrowCoder 所说,您没有也不应该在 C# 中为此实现使用指针。这段代码应该可以帮助您入门:

    internal class LLNode {  
        internal int data;  
        internal LLNode prev;  
        internal LLNode next;  
        public LLNode (int d) {  
            data = d;  
            prev = null;  
            next = null;  
        }  
    }  
    

    【讨论】:

      猜你喜欢
      • 2011-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多