理解列表
提供的程式碼示範了將引用類型與清單一起使用時的常見陷阱。 Tag
類別是引用類型,表示變數保存對物件記憶體位置的 引用,而不是物件本身的副本。
在循環內,相同的_tag
實例被重複修改。清單中的每次新增都不會建立新的 Tag
物件;相反,它新增了 same _tag
物件的另一個引用。 因此,最終清單包含多個指向 last 修改狀態 _tag
.
為什麼要用struct
可以解決問題
將 public class Tag
改為 public struct Tag
可以解決該問題,因為結構是值類型。 當分配一個結構體時,會建立該結構體資料的副本。 因此,循環的每次迭代都會建立一個完全獨立的 _tag
實例。對一個實例的修改不會影響其他實例,從而產生一個包含唯一 Tag
物件的清單。
派生集合類別相關性
問題並不是 TagCollection
類的設計所固有的。 TagCollection
類別本身似乎已正確實現。核心問題在於如何在填充清單的循環中處理 _tag
實例,特別是單一引用類型實例的重複修改。
以上是為什麼使用引用類型時向清單新增值會覆蓋先前的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!