使用lambda表达式时,列表中的属性已更改

时间:2016-11-07 13:55:59

标签: c# lambda

当我使用lambda表达式时,我不知道为什么列表中的项目已被更改。 这是我的代码

using System;
using System.Collections.Generic;
using System.Linq;

public class test
{
    public string id { get; set; }
    public string name { get; set; }
    public string no { get; set; }
}

public class Program
{
    public static List<test> a;
    public static List<test> b = new List<test>();      

    public static List<test> a_list() 
    {
        List<test> c = new List<test>();
        c.Add(new test() { id = "_01", name=null, no="1"});
        c.Add(new test() { id = "_02", name=null, no="2"});
        return c;
    }   

    public static void Main()
    {
        a = a_list();
        string key = "_01";
        //
        test i = new test();
        i = a.First(x => x.id.Equals(key));
        i.name = "xxxxxxx";
        b.Add(i);
        //
        Console.WriteLine("id:"+a[0].id+"\nName:"+a[0].name+"\nno:"+a[0].no);
        Console.WriteLine("id:"+b[0].id+"\nName:"+b[0].name+"\nno:"+b[0].no);
        Console.ReadLine();
    }
}

这是结果 ID:_01 名称:XXXXXXX 无:1 ID:_01 名称:XXXXXXX NO:1

为什么[0]等于&#34; xxxxxxx&#34;? (对不起,我的英语不好)

3 个答案:

答案 0 :(得分:3)

这里:

IncidentResolution

i = a.First(x => x.id.Equals(key)); i.name = "xxxxxxx"; i现在是对同一对象的引用。修改该对象的属性将影响这两者,因为它们是指向同一事物的指针。

答案 1 :(得分:0)

基本上你的代码是做什么的:

  • 它创建一个包含两个元素(a
  • 的列表
  • 它需要第一个元素并修改该元素的值
  • 它接受该元素并将其添加到第二个列表(b

结果是你有两个列表 - 一个(a)包含两个元素,另一个(b)只有一个,但是(这里是重要的一点) - 它是完全相同的元素作为a中的第一个元素。因此,当您编写两个列表的第一个元素时,结果是相同的。

答案 2 :(得分:0)

想象一下,你有一个相机指着一辆车。当车门打开时,您可以通过相机看到它,但相机不是汽车

现在你的朋友在一段距离之外也把他的相机对准了车。你们都可以看到门打开和关闭,灯光等等。

变量就像相机一样,汽车就是它指向的对象。 如果您关闭或摧毁其中一个摄像头,那么汽车仍在那里。事实上,如果你摧毁了两个摄像头,汽车仍然在那里(直到垃圾收集)。

请参阅此优秀文章:http://codebetter.com/karlseguin/2008/04/28/foundations-of-programming-pt-7-back-to-basics-memory/