【问题标题】:Pointer to struct in C# to create a linked list指向 C# 中的结构的指针以创建链表
【发布时间】:2013-05-09 04:57:16
【问题描述】:

C# 不喜欢指针,但我现在需要使用它们来创建一个链表,就像我们在 C 中所做的那样。结构很简单:

    public unsafe struct Livro
    {
        public string name;
        public Livro* next;
    }

但我收到错误消息:“无法获取托管类型的地址、大小或声明指向托管类型的指针”。有什么想法吗?

【问题讨论】:

  • 为什么不List<string>
  • @WouterHuysentruit 或者LinkedList<T>,如果你想要一个链表;)
  • @WouterHuysentruit 如果你想从中间插入/删除,并且不需要通过索引访问,在很多情况下会更好。
  • @WouterHuysentruit List<T> 由 Array 支持。 LinkedList<T> 是真正的双链表。

标签: c# pointers struct linked-list


【解决方案1】:

您可以只使用class 而不是struct

public class Livro
{
    public string Name { get; set; }
    public Livro Next { get; set; }
}

这将自动提供正确的行为。

话虽如此,您可能只想直接使用框架中的LinkedList<T> 类。

【讨论】:

  • 你是对的。我在课堂上也是这样做的,但是老师想要指点
  • C# 中的指针不是一个好主意。你确定他想让你用 C# 而不是 C/C++ 来做这个吗?
  • 它是 C#。他们正在学习如何使用指针。这就是为什么我不能使用集合或对象
  • @user2383078:应该很少在 C# 中对任何东西使用指针。除非需要在内存中构建一个链表数据结构以供以 C 等非托管语言编写的代码使用,否则应该使用对象引用而不是指针。
【解决方案2】:

问题在于 string 声明。你必须去低级并使用 char* 指针。使用unsafe 会带来离开托管世界的所有头痛......

【讨论】:

  • 我认为这可以解决问题。现在我将尝试使用 char 指针
  • @user2383078 - 要么回到 C/C++ 要么学习 C# 方式。 char 指针会使已经很糟糕的解决方案变得更糟。
  • 同意。早些时候他说,“这是 C# ......但老师想要指针”。那位老师应该因为教指针而受到称赞,但因为使用错误的工具来做这件事而被解雇。他会留下一堆几乎不懂指针的学生,但认为将块标记为unsafe 就可以了,这样他们就可以使用指针进行低级操作并更“高效”地做事。
【解决方案3】:

你可以用这样的结构来做到这一点:

struct LinkedList
{
    public int data;
    public LinkedListPtr next;
    public class LinkedListPtr
    {
        public LinkedList list;
    }
}

或者像这样:

struct LinkedList
{
    public int data;
    public LinkedList[] next;
}

但最好只使用class 作为链接列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 2011-08-03
    • 2020-05-10
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多