为什么在列表<>中添加新值会覆盖列表<>中的以前的值

继几个教程后,我能够成功创build一个集合类,它inheritance创build一个DataTable所需的function,该DataTable可以作为表值parameter passing给Sql Server的存储过程。 一切似乎都运作良好; 我可以添加所有行,看起来很漂亮。 但是,仔细观察后,我注意到当我添加一个新行时,所有前面的行的数据被新行的值覆盖。 所以,如果我有一个string值为“foo”的行,并添加了第二行的值“bar”,第二行将被插入(使两行DataTable),但两行将有值“bar ”。 任何人都可以看到这是为什么? 下面是一些代码,它的工作原理虽然简单一些(为了便于说明,标签类已经缩小了)。

以下是Collection类的:

using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Web; using Microsoft.SqlServer.Server; namespace TagTableBuilder { public class TagCollection : List<Tag>, IEnumerable<SqlDataRecord> { IEnumerator<SqlDataRecord> IEnumerable<SqlDataRecord>.GetEnumerator() { var sdr = new SqlDataRecord( new SqlMetaData("Tag", SqlDbType.NVarChar) ); foreach (Tag t in this) { sdr.SetSqlString(0, t.tagName); yield return sdr; } } } public class Tag { public string tagName { get; set; } } } 

这些被称为如下:

 //Create instance of collection TagCollection tags = new TagCollection(); //Create instance of object Tag _tag = new Tag(); foreach (string t in tagList) { //Add value to class propety _tag.tagName = t; //Add class to collection, this is where all previously added rows are overwritten tags.Add(_tag); } 

您在循环内部使用了Tag对象的同一个实例,因此tagName的每个更新都是相同的引用。 在循环中移动声明以获得循环的每一个新的对象:

 foreach (string t in tagList) { Tag _tag = new Tag(); //Add value to class propety _tag.tagName = t; //Add class to collection, this is where all previously added rows are overwritten tags.Add(_tag); } 

另外请注意,我更新了最后一行添加_tag而不是mTag因为我没有在任何地方看到这个定义。

在将标记添加到集合的循环中,您使用的是Tag的同一个对象实例。 从本质上讲,您将标签的名称设置为tagList中的第一个值,并将其添加到集合中,然后将相同标签的名称更改为tagList中的第二个值,然后再将其添加到集合中。

您的标签集合包含对同一个标签对象的多个引用! 在设置标签名称并将其添加到集合之前,每次在for循环内部实例化_tag。