簡體   English   中英

將字典值設置為 null 的引用類型的正確方法是什么?

[英]What is the proper way to set a dictionary value which is a reference type to null?

假設我們有一個 class,如下所示:-

        class DoubleLinkedListNode
        {
            public int Value { get; set; }

            public DoubleLinkedListNode(int value)
            {
                Value = value;
            }

            public DoubleLinkedListNode next = null;

            public DoubleLinkedListNode prev = null;
        }

然后我們創建一個字典,如下所示:-

IDictionary<int, DoubleLinkedListNode> dict = new Dictionary<int, DoubleLinkedListNode>();

字典的key將保存它包含的DoubleLinkedListNodeValue ,如下所示:-

DoubleLinkedListNode newNode = new DoubleLinkedListNode(value);
dict.Add(newNode.Value, newNode );

讓我們還創建一個 function ,它將字典值的類型作為輸入,我們在 function 的主體內創建該值null ,如下所示:

private void RemoveNode(DoubleLinkedListNode nodeToBeRemoved)
{
     if(nodeToBeRemoved != null)
     {
         //Do Something

         nodeToBeRemoved = null;
     }

}

我們這樣稱呼 function:-

RemoveNode(dict[someValue]);

讓我們創建另一個 function ,我們在其中明確地設置值null ,如下所示:-

    private void RemoveNodeAnother(DoubleLinkedListNode nodeToBeRemoved)
    {
         if(nodeToBeRemoved != null)
         {
             //Do Something
             dict[nodeToBeRemoved.Value] = null;
         }

    }

然后我們像這樣調用 function:-

RemoveNodeAnother(dict[someValue]);

上面兩個函數有什么區別?

我問的原因是我在 Leetcode 上做這個問題 我寫的解決方案如下:-

public class FirstUnique 
{
    private class DoubleLinkedListNode
    {
        public int Value { get; set; }

        public DoubleLinkedListNode(int value)
        {
            Value = value;
        }

        public DoubleLinkedListNode next = null;

        public DoubleLinkedListNode prev = null;
    }

    DoubleLinkedListNode dummyHeadNode = new DoubleLinkedListNode(-1);

    DoubleLinkedListNode dummyTailNode = new DoubleLinkedListNode(-1);

    IDictionary<int, DoubleLinkedListNode> dict = new Dictionary<int, DoubleLinkedListNode>();

    public FirstUnique(int[] nums) 
    {
        InitialiseDummyHeadAndTailNodes();

        foreach(int i in nums)
        {
            Add(i);
        }
    }

    public int ShowFirstUnique() 
    {
        return dummyHeadNode.next.Value;
    }

    public void Add(int value)
    {
        if (dict.ContainsKey(value))
        {
            RemoveNode(dict[value]);
        }
        else
        {
            DoubleLinkedListNode newNode = new DoubleLinkedListNode(value);

            AddNode(newNode);

        }
    }

    private void InitialiseDummyHeadAndTailNodes()
    {
        dummyHeadNode.next = dummyTailNode;
        dummyTailNode.prev = dummyHeadNode;
    }

    private void RemoveNode(DoubleLinkedListNode nodeToBeRemoved)
    {
        if(nodeToBeRemoved != null)
        {
            nodeToBeRemoved.prev.next = nodeToBeRemoved.next;
            nodeToBeRemoved.next.prev = nodeToBeRemoved.prev;

            // If I write nodeToBeRemoved = null, the solution won't pass.
            // But if I write dict[nodeToBeRemoved.Value] = null, the solution is accepted.

            dict[nodeToBeRemoved.Value] = null;
        }

    }

    private void AddNode(DoubleLinkedListNode nodeToBeAdded)
    {
        //Update the pointers.
        nodeToBeAdded.prev = dummyTailNode.prev;
        nodeToBeAdded.prev.next = nodeToBeAdded;
        nodeToBeAdded.next = dummyTailNode;
        dummyTailNode.prev = nodeToBeAdded;

        //Add the node to the dictionary.
        dict.Add(nodeToBeAdded.Value, nodeToBeAdded);
    }
}

我已經在異常所在的地方發表了評論。 這種行為的原因可能是什么?

只有一種方法可以“將字典值設置為空” -

 dictionary[key] = null;

確實,如果密鑰不存在,您需要先添加它...這導致將值設置為 null -

 if (dictionary.ContainsKey(key)) 
        dictionary[key] = null;
 else
        dictionary.Add(key, null);

請注意,將值設置為null對之前存儲的內容的影響為零

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM