C# 向列表中添加虚假数据

C# 向列表中添加虚假数据,c#,C#,所以我试着创建一个虚假的物品清单 var items = new List<Item>(); var item = new Item { Name = "A"; } for(int i=0; i<3; i++) { items.Add(item); } item.Name = "B"; for(int i = 0; i<2; i++) { items.Add(item); } var items=newlist(); var项目=新项

所以我试着创建一个虚假的物品清单

var items = new List<Item>();

var item = new Item 
{
    Name = "A";
} 

for(int i=0; i<3; i++)
{
    items.Add(item);
}

item.Name = "B";

for(int i = 0; i<2; i++)
{
    items.Add(item);
}
var items=newlist();
var项目=新项目
{
Name=“A”;
} 
对于(int i=0;i
创建对象。对象具有引用语义,即如果更改名称,所有引用将看到相同的名称。
您必须向列表中添加新对象,例如,在循环中创建新项

创建对象。对象具有引用语义,即如果更改名称,所有引用将看到相同的名称。
您必须向列表中添加新对象,例如在循环中创建新项。

代码中的问题是

  • 您创建了一个
    对象,其
    名称
    属性为“A”
  • 将同一对象插入集合的三个空间,但所有空间都指向同一对象
  • 您已将
    Name
    属性更改为“B”
  • 将同一对象插入到集合的两个新空间中
  • 由于变量
    item
    和集合的所有5个空格指向同一个对象,因此对这些引用中任何一个的任何更改都将更改对象并反映在所有引用中
  • 有关更多详细信息,请使用谷歌
    参考类型变量

    var items = new List<Item>();
    
    
    
    for(int i=0; i<3; i++)
    {
        var item = new Item() 
        {
            Name = "A";
        } 
        items.Add(item);
    }
    
    
    
    for(int i = 0; i<2; i++)
    {     
        var item = new Item() 
        {
            Name = "B";
        } 
        items.Add(item);
    }
    
    var items=newlist();
    
    对于(inti=0;i代码中的问题是

  • 您创建了一个
    对象,其
    名称
    属性为“A”
  • 将同一对象插入集合的三个空间,但所有空间都指向同一对象
  • 您已将
    Name
    属性更改为“B”
  • 将同一对象插入到集合的两个新空间中
  • 由于变量
    item
    和集合的所有5个空格指向同一个对象,因此对这些引用中任何一个的任何更改都将更改对象并反映在所有引用中
  • 有关更多详细信息,请使用谷歌
    参考类型变量

    var items = new List<Item>();
    
    
    
    for(int i=0; i<3; i++)
    {
        var item = new Item() 
        {
            Name = "A";
        } 
        items.Add(item);
    }
    
    
    
    for(int i = 0; i<2; i++)
    {     
        var item = new Item() 
        {
            Name = "B";
        } 
        items.Add(item);
    }
    
    var items=newlist();
    
    对于列表中的(int i=0;i存储了对变量
    item
    的引用。更改
    item.Name
    会更改so的名称,当您查看列表中的项目时,所有项目都会将
    Name
    设置为“B”,因为有对item对象的引用,该对象的名称现在是“B”。如果您只想拥有最后两个项目名称“B”,而不是

    item.Name = "B";
    
    使用以下命令:

    var item = new Item{
        Name = "B"
    };
    

    列表中存储了对变量
    item
    的引用。更改
    item.Name
    会更改的名称,因此当您查看列表中的项目时,所有项目的
    Name
    都将设置为“B”,因为有对项目对象的引用,该对象的名称现在是“B”。如果您只想拥有最后两个项目名称“B”,而不是

    item.Name = "B";
    
    使用以下命令:

    var item = new Item{
        Name = "B"
    };
    
    在C#和大多数现代语言中,对象被视为引用类型。这意味着内存中只有一个实际对象的副本,该变量的每个实例都只是指向该副本的引用

    因此,当对象的引用被修改时,引用该对象的所有实例都将获得新值

    var item = new Item() 
    {
        Name = "A";
    } 
    

    正在修改同一个对象。因此,列表中的所有值都具有名称
    A
    ,然后将其更改为
    B
    ,并将该值的另外两个副本分配给数组-总共5个

    如果您希望有3个
    A
    和2个
    B
    ,则需要声明一个新对象并分配此对象。请尝试以下操作:

    var items = new List<Item>();
    
    var itemA = new Item() 
    {
        Name = "A";
    } 
    
    for(int i=0; i<3; i++)
    {
        items.Add(itemA);
    }
    // item list now has 3 A
    var itemB = new Item() 
    {
        Name = "B";
    } 
    
    for(int i = 0; i<2; i++)
    {
        items.Add(itemB);
    }
    // itme list now has 3 A and 2 B
    
    var items=newlist();
    var itemA=新项目()
    {
    Name=“A”;
    } 
    对于C#和大多数现代语言中的(inti=0;i),对象被视为引用类型。这意味着内存中只有一个实际对象的副本,该变量的每个实例都只是指向该副本的引用

    因此,当对象的引用被修改时,引用该对象的所有实例都将获得新值

    var item = new Item() 
    {
        Name = "A";
    } 
    

    正在修改同一个对象。因此,列表中的所有值都具有名称
    A
    ,然后将其更改为
    B
    ,并将该值的另外两个副本分配给数组-总共5个

    如果您希望有3个
    A
    和2个
    B
    ,则需要声明一个新对象并分配此对象。请尝试以下操作:

    var items = new List<Item>();
    
    var itemA = new Item() 
    {
        Name = "A";
    } 
    
    for(int i=0; i<3; i++)
    {
        items.Add(itemA);
    }
    // item list now has 3 A
    var itemB = new Item() 
    {
        Name = "B";
    } 
    
    for(int i = 0; i<2; i++)
    {
        items.Add(itemB);
    }
    // itme list now has 3 A and 2 B
    
    var items=newlist();
    var itemA=新项目()
    {
    Name=“A”;
    } 
    
    对于(int i=0;i,这里的问题是,您正在向列表中添加对您创建的对象(
    )的引用,而不是不同的对象。因此,列表中的5个项以及您的
    变量都是相同的对象,这意味着,如果您更改了一个,您也会更改对它的其他引用

    为了清晰起见,请尝试以下方法:

    var项目=新项目
    {
    名字“你好”
    };
    var secondItem=项目;
    item.Name=“世界”;
    //这将打印“WorldWorld”
    Console.WriteLine(item.Name+secondItem.Name);
    
    合理的原则发生在列表项上,只是第二项(以及第三项和第四项,…)不在变量中,而是由列表持有,而不是单独的变量
    secondItem

    特别是为了解决您的问题,您需要在循环的每次迭代中创建一个新对象。如下所示:

    var items=newlist();
    项目;
    对于(int i=0;i<3;i++)
    {
    项目=新项目
    {
    Name=“A”
    };
    项目。添加(项目);
    }
    对于(i=0;i<2;i++)
    {
    项目=新项目
    {
    Name=“B”;
    };
    项目。添加(项目);
    }
    

    这段代码可以减少到几行(具体来说是6行),但我留了这么长的时间,因为它更容易阅读,更重要的是更容易理解,就像这样。这里的问题是,您正在向您创建的对象(
    )添加引用对于列表,不是不同的对象。因此,列表中的5个项目和
    项目
    变量都是相同的对象,这意味着,如果您更改了一个,那么您也会更改对它的其他引用

    为了清晰起见,请尝试以下方法:

    var项目=新项目
    {
    名字“你好”
    };
    变量