为什么在 for 循环的每次迭代中实例化一个新对象会覆盖以前的列表条目?



我正在尝试动态填充对象列表,如下所示:

using System;
using System.Collections.Generic;
namespace test
{
class MainClass
{
public static void Main(string[] args)
{
List<string> items = new List<string>() { "item1", "item2", "item3" };
List<MainObject> objects = new List<MainObject>();
foreach (var item in items)
{
objects.Add(new MainObject(item));
foreach (MainObject o in objects)
Console.WriteLine(o.getString());
}
}
}
class MainObject
{
public MainObject() { }
public MainObject(string theString) { nString = theString; cString = theString; }
private static string nString { get; set; }
private static string cString { get; set; }
public string getString() { return nString; }
}
}

我认为由于我使用的是"new"运算符,因此我每个循环都会实例化一个新对象,但它每次都会覆盖上一个条目。

它给出如下输出:

item1
item2
item2
item3
item3
item3

这是您使用WriteLine的方式的副作用,或者更准确地说,是您使用WriteLine的方式。

将代码修改为如下所示的内容:

List<Object> objects = new List<Object>();
foreach (var theString in stringList)
{
objects.Add(new Object(theString));
}
//this should be outside of first loop
foreach (Object object in objects)
{
Console.WriteLine(object.getValue());
}

MainClass的定义是使用static字段,这会导致每次创建新MainObject时覆盖其值。

每个static字段只有一个内存位置。 在构造函数中,将向该内存位置分配参数的值,该参数将覆盖以前传递给构造函数的任何值。

另一方面,实例(非静态(字段在每个实例中都有一个单独的位置。 在这种情况下,赋值会影响该对象实例,而不会影响任何其他对象实例。

您所要做的就是从这些属性中删除static修饰符。

class MainObject
{
public MainObject() { }
public MainObject(string theString) { nString = theString; cString = theString; }

// Remove 'static' from these two declaration
private string nString { get; set; }
private string cString { get; set; }
public string getString() { return nString; }
}

相关内容

最新更新