在我的应用程序中,我从数据库中检索3行数据,循环遍历数据行以将数据分配给我的客户对象,然后将客户添加到客户集合中:
// new customer object to fill in loop and assign to collection
tracker.Customer myCustomer = new tracker.Customer();
// new customer collection object to fill later
Tracker.customerCollection myCustomerCollection = new trackerCustomerCollection();
foreach (System.Data.DataRow drRow in dsResults.Tables[0].Rows)
{
myCustomer.CustomerID = Item["CustomerID"];
myCustomer.FKBandID = Convert.ToInt32(drRow["FKBandID"]);
myCustomer.FKSectorID = Convert.ToInt32(drRow["FKSectorID"]);
myCustomer.CustomerName = Convert.ToString(drRow["CustomerName"]);
myCustomer.CustomerAddress = Convert.ToString(drRow["CustomerAddress"]);
myCustomer.CustomerPhoneNumber = Convert.ToString(drRow["CustomerPhoneNumber"]);
myCustomerCollection.Add(myCustomer);
}
问题在于,当我尝试使用填充的myCustomerCollection
时,集合中的3个Customer
对象都是相同的。我遍历循环时myCustomer
的每个实例都不同,但一旦添加到myCustomerCollection
,它们就会发生变化。每个项目都与最后添加的项目相同。
如果有人能指出我正确的方向,我会非常感激,我在VB.NET中使用这个原则没有任何问题,但我现在被迫使用C#并且在查找源代码时遇到了麻烦我的问题。
答案 0 :(得分:2)
这是因为您正在创建Customer
对象的1个实例,并将其添加到列表中3次(每次循环时对其进行修改)。
如果您在循环中移动new tracker.Customer()
,则会创建3个单独的客户对象。
答案 1 :(得分:1)
您需要在for循环的每次迭代中创建一个新的tracker.Customer
,而不是在循环之外的单个实例:
foreach (var drRow in dsResults.Tables[0].Rows)
{
// Create a brand new instance of a customer and set its properties
var myCustomer = new tracker.Customer()
{
CustomerID = Item["CustomerID"];
FKBandID = Convert.ToInt32(drRow["FKBandID"]);
FKSectorID = Convert.ToInt32(drRow["FKSectorID"]);
CustomerName = Convert.ToString(drRow["CustomerName"]);
CustomerAddress = Convert.ToString(drRow["CustomerAddress"]);
CustomerPhoneNumber = Convert.ToString(drRow["CustomerPhoneNumber"])
};
// Add your new customer to the customer collection
myCustomerCollection.Add(myCustomer);
}
现在正在发生的事情是您的myCustomerCollection
包含对同一myCustomer
实例的三个引用,因为您没有为数据库中的每条记录实例化new
。您现在在myCustomer
中看到的值可能与数据的最后一行有关。
通过在for循环的每次迭代中创建新实例,您的列表中将有三个不同的tracker.Customer
对象。
这种行为在VB.NET中完全相同。