c#node struct自定义LinkedListNode结构中的循环依赖

问题描述 投票:0回答:1

所以,我试图在c#中编写一个新的链表,它在不安全的上下文中表现正常,所以我可以将它传递给多线程进程。不幸的是,即使我需要的是一个恒定大小的指针,这也是一个循环依赖。我宁愿不把它变成一个类,我也不确定它会在不安全的环境中表现出来。我也不认为接口解决方案在我的情况下会起作用,因为它实际上是指向自身的指针。此外,当我尝试编写它时,它会抱怨一些代码正在被管理......我该如何解决?这是代码片段:

struct UnsafeLinkedListNode<T>
{
    public T value;
    unsafe public UnsafeLinkedListNode<T>* next;
    unsafe public UnsafeLinkedListNode<T>* prev;
}

class UnsafeLinkedList<T>
{

    unsafe public UnsafeLinkedListNode<T>* head = null;
    unsafe public UnsafeLinkedListNode<T>* tail = null;
    public ulong count;
    public void AddAfter(T value)
    {
        UnsafeLinkedList<T> temp = new UnsafeLinkedList<T>();
        temp.value = value;
        AddAfter(temp);
    }
    public void AddAfter(UnsafeLinkedListNode<T>* value)
    {
        unsafe
        {
            if(head !=null)
            {
                value.prev = tail;
                value.next = null;
                tail.next = value;
                count++;

            }
            else
            {
                value.next = null;
                value.prev = null;
                head = value;
                tail = value;
                count++;
            }
        }
    }
}
c# parallel-processing linked-list circular-dependency unsafe
1个回答
0
投票

这解决了循环依赖和代码管理问题。最后在3天后解决,然后在发布后的几分钟内解决。不幸的是,由于某种原因,仍然存在尝试获取节点地址的问题,但这是此问题的解决方案:

struct UnsafeLinkedListNode
{
    public EncodedData value;
    unsafe public UnsafeLinkedListNode* next;
    unsafe public UnsafeLinkedListNode* prev;
}

class UnsafeLinkedList
{

    unsafe public UnsafeLinkedListNode *head = null;
    unsafe public UnsafeLinkedListNode *tail = null;
    public ulong count { get; private set; }
    unsafe public void AddAfter(EncodedData value)
    {
        UnsafeLinkedListNode temp = new UnsafeLinkedListNode();
        temp.value = value;
        AddAfter(&temp);
    }
    unsafe public void AddAfter(UnsafeLinkedListNode* value)
    {
        unsafe
        {
            if(head !=null)
            {
                value->prev = tail;
                value->next = null;
                tail->next = value;
                count++;

            }
            else
            {
                value->next = null;
                value->prev = null;
                head = value;
                tail = value;
                count++;
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.