我想创建一个对象列表。我创建了一个类,我将使用我的对象列表
public class DataSet
{
public string[] setOfValues = new string[5];
}
当我在代码中使用这个类时,我无法删除字符串数组,因为对象列表也会被更改。
void Button1Click(object sender, EventArgs e)
{
List<DataSet> myListOfDataSets = new List<DataSet>();
DataSet mySet = null;
string[] myArrayOfStrings = {"One", "Two", "Three", "Four", "Five"};
mySet = new DataSet();
mySet.setOfValues = myArrayOfStrings;
myListOfDataSets.Add(mySet);
for(int i = 0; i < 5; i++)
{ //this command wipes off the values from myListOfDataSets
myArrayOfStrings[k] = string.Empty;
}
}
}
我希望能够在不影响myListOfDataSets的情况下重用myArrayOfStrings。 一旦我向myListOfDataSets添加了一个新对象,我就不明白以后命令如何应用于另一个项目会改变这个列表的内容。
答案 0 :(得分:3)
他们是相同的项目!
C#中的类和数组变量只是引用。实际的对象在某处的堆中关闭。您所做的所有分配只是为同一个对象移动引用。
您可以做的是替换参考:
void Button1Click(object sender, EventArgs e)
{
List<DataSet> myListOfDataSets = new List<DataSet>();
DataSet mySet = null;
string[] myArrayOfStrings = {"One", "Two", "Three", "Four", "Five"};
mySet = new DataSet();
mySet.setOfValues = myArrayOfStrings;
myListOfDataSets.Add(mySet);
//sets variable to **new** object instance, so it no
// longer refers to the old one
myArrayOfStrings = new string[] {"","","","",""};
//This whole section is now redundant
for(int i = 0; i < 5; i++)
{ //this command wipes off the values from myListOfDataSets
myArrayOfStrings[k] = string.Empty;
}
}
你可以进一步显着缩短所有这些代码:
void Button1Click(object sender, EventArgs e)
{
var myListOfDataSets = new List<DataSet>
{
new DataSet() {setOfValues = {"One", "Two", "Three", "Four", "Five"} }
};
}
答案 1 :(得分:1)
所以发生的事情是你将mySet的setOfValues设置到位于myArrayOfStrings&#39;的数组中。地址。这意味着mySet的setOfValues不是一个单独的对象,而是一个单独的对象,而不是你指定的对象,而是同一个对象。这就是为什么当你更新myArrayOfStrings时,mySet的值也会改变。
要获得您想要的结果,请遍历myArrayOfStrings并将mySet.setOfValues [i]设置为myArrayOfStrings [i],您应该设置好!