2

我正在工作的对象列表。我的代码看起来像这样

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);
}

谁能告诉我为什么会这样?

4

6 回答 6

2

如果不是每次都创建一个新的 Emp 对象,那么每次都会覆盖并插入相同的对象。

想象一张纸。你在上面写,你把它写进书里。在同一张纸上书写并多次放入书中是行不通的。在单页上写会很乱。对于每一页,您都需要一张新纸。

于 2013-10-24T06:02:51.490 回答
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 旁注:

您可能希望像这样简化代码:

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; }

于 2013-10-24T06:06:08.937 回答
1

当您添加到 emplist 时,您添加的是“empobj”,它是对 emp 对象的引用。

除非您每次都创建一个新的 emp 对象,并将该新条目分配给 empobj 引用,否则您只是一次又一次地添加相同的引用。

因此,当您更改该引用的内容时,您会更改列表中的所有条目。

于 2013-10-24T06:01:50.947 回答
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);
}
于 2013-10-24T06:04:50.587 回答
0

当您这样做时emp empobj = new emp();,您将创建一个新的emp.

这行代码告诉内存分配器将内存分配给emp对象的新实例。

在您的第一个示例中,您只有一个实例,并且您在foreach循环中覆盖了属性值。

但是,在第二个示例中,您emp在循环中创建了一个新的对象实例。

于 2013-10-24T06:07:22.833 回答
0

我们可以说 List 存储对对象的引用,这就是为什么在第一种情况下我们添加相同的引用,但在第二种情况下我们添加对不同对象的引用,因为每个循环中的empobj都是一个新对象。

于 2013-10-24T06:08:40.380 回答