簡體   English   中英

Queue.Contains 返回 false 而不是 true

[英]Queue.Contains returns false instead of true

開發商! 我終於失去了邏輯。 這段代碼有什么問題? 它必須為我返回 true,因為 Queue 包括姓名 Jack。 為什么不? 我是否以錯誤的方式使用方法? 感謝您對我簡單問題的回答!

 namespace DataStructures
    {
        class Program
        {
            static void Main(string[] args)
            {
                Queue<Employee> line = new Queue<Employee>();
                line.Enqueue(new Employee { Name = "Jack" });
                line.Enqueue(new Employee { Name = "Nick" });
                line.Enqueue(new Employee { Name = "Vova" });
                line.Enqueue(new Employee { Name = "Andrew" });

                Console.WriteLine(line.Contains(new Employee { Name = "Jack" }));
                Console.ReadLine();
            }
        }

        class Employee
        {
            public string Name { get; set; }
        }
    }

您的代碼運行良好,打印“false”是絕對正常的。

您稱為 Employee 的類型是一個類,因此它是一個引用類型。 默認情況下,引用類型通過引用進行比較。 這是 System.Object 中定義的相等語義,除非提供了 Equals 方法的覆蓋,否則所有類都會繼承它。

每次編寫 new Employee() 代碼時,您都在創建employee 類的一個新實例:這基本上意味着您正在創建一個新對象在堆中分配新內存(這是計算機內存的一部分) C# 對象所在的位置)。

看下面的代碼:

var mark = new Employee(){ Name = "Mark" };
var henry = new Employee() { Name = "Henry" };

var areEquals = mark.Equals(henry);
var areSameReference = Object.ReferenceEquals(mark, henry);

Console.WriteLine(areEquals); // this will print false
Console.Writeline(areSameReference); // this will print false

在上面的代碼中,您正在創建 Employee 類的兩個不同實例,並且這樣做是在堆中創建兩個不同的對象(換句話說,您正在分配兩個不同的內存空間以存儲兩個不同的對象)。 這就是為什么當你調用 Equals 時你會得到 false,因為默認情況下引用類型是按引用比較的。

當您在變量 mark 和 henry 上調用 Object.ReferenceEquals 時,您會得到 false,因為該變量引用了兩個不同的內存地址,因為您創建的兩個對象存儲在堆的不同內存地址中。

如果要比較具有不同語義的 Employee 對象,例如通過比較它們的名稱,則必須覆蓋 Equals 和 GetHashCode。 我建議你仔細閱讀一本關於 C# 的介紹性書籍,比如這本

暫無
暫無

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

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