2013-10-24 50 views
2

我在工作的對象列表。我的代碼看起來是這樣的爲什麼需要在填充List時在循環的每次迭代中創建一個新對象?

public class emp 
{ 
    public string emp_name{get;set;} 
    public int emp_id{get;set;} 
} 

List<emp> emplist = new List<emp>; 
emp empobj = new emp(); 
// fetching data from data table 
foreach (DataRow row in ds.Tables[0].Rows) 
{ 
    // initialize emp object 
    empobj.emp_name = row["emp_name"].ToString(); 
    empobj.emp_id = (int)row["emp_id"]; 

    // add empobject to emp list 
    emplist.add(empobj); 
} 

如果2個記錄被獲取從表然後我列出了每個列表中的對象最後記錄的細節。

我發現的是,如果我不每次創建新的emp對象,並添加到列表中,它也覆蓋列表中的前一個值。此

的解決方案是

// fetching data from data table 
foreach (DataRow row in ds.Tables[0].Rows) 
{ 
    // create new object every time 
    emp empobj = new emp(); 

    // initialize emp object 
    empobj.emp_name = row["emp_name"].ToString(); 
    empobj.emp_id = (int)row["emp_id"]; 

    // add empobject to emp list 
    emplist.add(empobj); 
} 

任何一個可以告訴我爲什麼會這樣呢?

+0

在第一個示例中,您將值分配給同一個對象。所以,價值觀正在被覆蓋。 – NomadTraveler

+0

我改變了你的帖子的標題 - 如果你不喜歡這個改變,隨時恢復/編輯。 –

回答

1

當您添加到emplist時,您將添加'empobj',它是對emp對象的引用。

除非您每次創建一個新的emp對象,並將該新條目分配給empobj引用,否則您只是一次又一次地添加相同的引用。

因此,當您更改該參考的內容時,您將更改列表中的所有條目。

2

如果每次都不創建新的Emp對象,則每次都會覆蓋並插入同一個對象。

想象一張紙。你寫在上面,你把它放在書裏。寫在同一張紙上並多次放入書中將無法正常工作。這將是一個一頁上寫亂七八糟。對於每一頁你需要一張新紙。

1

在你的代碼中,你正在創建一個emp類的實例,覆蓋每行的元素,並將多個引用同一個對象保存到列表中。

您需要將代碼更改爲:

List<emp> emplist = new List<emp>; 
// fetching data from data table 
foreach (DataRow row in ds.Tables[0].Rows) 
{ 
    // initialize emp object 
    emp empobj = new emp(); 
    empobj.emp_name = row["emp_name"].ToString(); 
    empobj.emp_id = (int)row["emp_id"]; 

    // add empobject to emp list 
    emplist.add(empobj); 
} 
1

從本質上講,你的代碼的第一塊有效地做到這一點:

emp empobj = new emp(); 
empobj = new emp(); 
empobj = new emp(); // "final" version of the object 

emplist.Add(empobj); // Same (final) added each time. 
emplist.Add(empobj); 
emplist.Add(empobj); 
... 

你的代碼的最後一塊有效呢

emplist.Add(new emp()); // New object each time. 
emplist.Add(new emp()); 
emplist.Add(new emp()); 
... 

2 Sidenotes:

您可能要簡化你這樣的代碼:

foreach (DataRow row in ds.Tables[0].Rows) 
{   
    emplist.add(new empobj{ 
          emp_name = row["emp_name"].ToString(), 
          empobj.emp_id = (int)row["emp_id"] 
          }); 
} 

..和你可能要堅持命名規則,使代碼更容易閱讀和理解;即使用Emp作爲類名(大寫)。同樣的屬性,但在那裏,避免下劃線(這是爲了將它們與字段和其他變量分開):

public string EmpName{ get; set; }public int EmpId{ get; set; }

0

當你做emp empobj = new emp();,你創建一個新的實例emp

這行代碼告訴內存分配器將內存分配給emp對象的新實例。

在第一個示例中,您只有一個實例,並且您正在覆蓋foreach循環中的屬性值。

但在第二個示例中,您正在循環中創建一個新的emp對象實例。

0

我們可以說,列表存儲對象的引用,這就是爲什麼在第一種情況下,我們添加相同的,但在第二個例子中,我們添加到不同對象的引用,因爲empobj在每個週期中是一個新的對象。

相關問題