我正在尝试动态填充对象列表,如下所示:
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; }
}