这是我的示例代码,
Book
更改 public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
对象的名称属性后,它还将List<myClass> myclass1 = new List<myClass>();
List<myClass> myclass2 = new List<myClass>();
//add data to myClass1 from source
foreach (myClass data in source)
myclass1.Add(data);
//add data to myClass2 from source
foreach (myClass data in source)
myclass2.Add(data);
//Change name property only for myclass1
foreach (myClass data in myclass1)
data.Name = "Test";
的name属性值修改为'Test'。是什么原因&amp;我该如何避免呢?
答案 0 :(得分:2)
这是因为你在两个列表中都放了同样的东西!
如果您希望每个列表的内容不同,则不要将相同的内容放入其中。
如果myClass
实施IClonable
,则可以使用
foreach (myClass data in source)
myclass1.Add((myClass)data.Clone());
答案 1 :(得分:1)
这是因为data
在两个列表中都相同。
要实现您需要将不同的数据放在第二个列表中,如下所示: -
var source2 = source.clone();
foreach (myClass data in source2 )
myclass2.Add(data);
答案 2 :(得分:1)
这是因为您使用引用类型,这意味着您只将实例的引用放入列表中,因此基本上您必须列出包含相同元素的引用。您可以使用值类型,但如果它具有引用类型字段,它仍将引用其中的同一对象实例。 你colud尝试克隆或serislise和deserislize对象,但在列表后将不包含来自源的元素只是他们的副本。
答案 3 :(得分:0)
myClass
是引用类型。要解决此问题,您应该添加到data
的第二个列表副本。
答案 4 :(得分:0)
列表通过引用存储,生成临时对象并添加到列表中。
foreach(myClass data in source)
{
myClass tmpData = new myClass(){
Something = data.Something;
};
myClass1.Add(tmpData);
}
答案 5 :(得分:0)
详细了解值类型和引用类型之间的区别以及它们在c#中的工作方式。
请检查:What is the difference between a reference type and value type in c#?