C# 記憶體位址陷阱
//格式
public class testAddClass
{
public string id { get; set; } //Id
public string name { get; set; } //名稱
}
//預設值,手動先塞兩筆資料
List<testAddClass> testData = new List<testAddClass>();
testData.Add(new testAddClass() { id = "1" ,name = "A" });
testData.Add(new testAddClass() { id = "2" ,name = "B" });
//範例開始(錯誤)
List<testAddClass> ListDeta = new List<testAddClass>(); //最後存容器
testAddClass Deta = new testAddClass(); //臨時使用容器
foreach (var p in testData)
{
Deta.id = "Id=" + p.id;
Deta.name = "Name=" + p.name;
ListDeta.Add(Deta);
}
//執行結果
/*
ListDeta[0].id => "Id=2"
ListDeta[0].name => "Name=B"
ListDeta[1].id => "Id=2"
ListDeta[1].name => "Name=B"
疑是Add資料時,為先暫存記憶體位置,做多次Add時候相憶體位置同記,故資料只有最後一筆多次新增
*/
//範例開始(更正)
List<testAddClass> ListDeta = new List<testAddClass>(); //最後存容器
foreach (var p in testData)
{
//**修改程式位置--開始--**
testAddClass Deta = new testAddClass(); //臨時使用容器
//**修改程式位置--結束--**
Deta.id = "Id=" + p.id;
Deta.name = "Name=" + p.name;
ListDeta.Add(Deta);
}
//執行結果
/*
ListDeta[0].id => "Id=1"
ListDeta[0].name => "Name=A"
ListDeta[1].id => "Id=2"
ListDeta[1].name => "Name=B"
將容器再回圈內建立,每次都有新的記憶體,故不會有覆蓋的問題
*/
我只是一棵樹