[英]How list<T> to check whether contains a custom struct?
我有以下實現
// Contains returns true if the specified element is in the List.
// It does a linear, O(n) search. Equality is determined by calling
// item.Equals().
//
public bool Contains(T item) {
if ((Object) item == null) {
for(int i=0; i<_size; i++)
if ((Object) _items[i] == null)
return true;
return false;
}
else {
EqualityComparer<T> c = EqualityComparer<T>.Default;
for(int i=0; i<_size; i++) {
if (c.Equals(_items[i], item)) return true;
}
return false;
}
}
如果item
是struct
值類型,那么流程if
進入if
塊而不是else
塊? 我對此實現感到困惑。
誰能向我解釋Contains
方法如何評估像struct
這樣的值類型?
if
部分僅檢查我們是否在列表中尋找null
項目。 如果這樣做,它將遍歷列表,並在列表項中查找null
值。 這部分僅對引用類型有效,因為值類型不能為null
。
在else
另一方面的一部分,是做的所有檢查的情況下,當產品不能null
,所以這段代碼被用於structs
為好。 它所做的是為該類型( EqualityComparer<T> c = EqualityComparer<T>.Default
)獲得一個默認的相等比較器,並使用此比較器在列表中查找項目。
您需要了解的是value type
和reference type
之間的區別。
就像int
, long
等一樣, struct
不是存儲在heap
而是存儲在stack
。 reference type
在stack
上存儲了一個指向實際對象數據的指針(這是一個內存地址),該stack
存儲在heap
。
(繼續閱讀有關堆棧和堆之間的區別。)
然而,加入了struct
的東西像一個ArrayList
甚至List<object>
仍然會起作用,因為它極有可能被裝箱為reference type
第一,因此struct
西港島線不能 null
,即使你通過了default(<struct type>)
它仍然不會為 null
。
然后,就像@dotnetom解釋的else
部分一樣,執行並評估struct
是否在集合中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.