當調用List Remove 失效時 [C#] .

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   使用   os   strong   

有沒有試過從一個集合裡面移除一個對象之後,這個集合仍然留有這個對象?世界之大,無奇不有。稍有疏忽,便會導致這種奇怪的現象。現在讓我們看看這個“不死”對象究竟是怎麼一回事。

 

1、“不死”對象現身

這個問題起初是我一個同事提出的,為了重現“不死”對象,現把代碼簡化如下:

// Code #01

IList products = new List<Product>();
products.Add(GetProduct("1412"));
products.Remove(GetProduct("1412"));

其中 Product 類代碼如下:

// Code #02

class Product
{
    public Product(string id)
    {
        m_ID = id;
    }

    private string m_ID;
    public string ID
    {
        get { return m_ID; }
    }

    public override string ToString()
    {
        return "ID: " + m_ID;
    }
}

而 GetProduct 方法則根據傳入的 ID 從資料庫讀取資料並返回,它的簽名如下:

// Code #03

public static Product GetProduct(string id);

要想知道編號為 1412 的對象是否從 products 中移除,只需在 Code #01 的最後加上這樣一行:

// Code #04

Console.WriteLine(products.Count);

 

2、一不小心掉進陷阱

不知道你有沒有查看 SDK 的習慣,其實 SDK 裡面蘊藏著很多對我們解決問題有啟發作用的資訊的。現在讓我們看看 SDK 裡面能否找到什麼蛛絲馬跡。

由於 products 的真身是 List<T>,所以我們有必要看看 List<T> 是如何? IList.Remove 的:

This method determines equality using the default equality comparer EqualityComparer.Default for T, the type of values in the list.

原來,List<T> 在 IList.Remove 中使用 EqualityComparer.Default 來判斷兩個對象是否相等。那麼 EqualityComparer.Default 又是如何得知兩個對象是否相等呢?

The Default property checks whether type T implements the System.IEquatable generic interface and if so returns an EqualityComparer that uses that implementation. Otherwise it returns an EqualityComparer that uses the overrides of Object.Equals and Object.GetHashCode provided by T.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.