【发布时间】:2017-01-02 21:20:05
【问题描述】:
我创建了一小段代码来测试我的项目的一部分。它正在工作,但是我有一些问题......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace testtodel
{
class Program
{
private class BucketItems
{
private List<Item> ItemList;
private Item item;
public BucketItems()
{
//item = new Item();
ItemList = new List<Item>();
}
public void AddBucketItem(int _Start, int _End)
{
item = new Item();
item.SetItem(_Start, _End);
ItemList.Add(item);
}
public void PrintItemList()
{
for (int i = 0; i < ItemList.Count(); i++)
{
Console.WriteLine("Item: " + i.ToString() + " S: " + ItemList[i].Start.ToString() + " E: " + ItemList[i].End.ToString() + " D: " + ItemList[i].Range.ToString());
}
}
}
private class Item
{
public int Range { get; set; }
public int Start { get; set; }
public int End { get; set; }
public void SetItem(int _Start, int _End)
{
Start = _Start;
End = _End;
Range = _End - _Start;
}
}
static void Main(string[] args)
{
BucketItems bucketItems = new BucketItems();
bucketItems.AddBucketItem(0, 100);
bucketItems.AddBucketItem(200, 300);
bucketItems.AddBucketItem(700, 1000);
bucketItems.PrintItemList();
Console.ReadLine();
}
}
}
我不完全理解的事情与行有关
item = new Item();
正如您在代码中看到的那样,有 2 行这样的行,1 行注释,1 行未注释。
第 1 部分: 当代码按现在这样执行时,每次调用 'AddBucketItem' 方法时,它都会创建一个新的 'Item' 类实例,然后 'Item.SetItem' 将设置 'Start'、'End'、'Range' 在'item' 变量,这将被添加到 'ItemList' 中。
第 2 部分: 当我评论现有的 'item = new Item();'行并取消注释另一个然后我会期待以下。当创建 BucketItem 类的新实例时,它还将创建一个新的 'Item' 实例,因为它是在 'BucketItem' 构造函数中定义的。然后,当调用'AddBucketItem' 方法时,'item' 变量将由'item.SetItem' 设置,然后添加到ItemList。 这对于第一次迭代是可以的。但是,如果我再次调用 'AddBucketItem' 方法,使用新的 'Start' 和 'End' 参数,这也会改变已添加的 ItemList[0]。
问题:
-
为什么 Part_2 中的每个调用都会更改已添加到 ItemList 的所有元素?唯一的解释是列表中的所有元素都存储对“项目”变量的引用,并且当通过更改(开始、结束、持续时间)更改此变量时,它也会更改所有 ItemList。但我不知道这是否是正确的解释,如果是,我不知道它为什么会这样。悬停我假设答案是不同的,因为即使我在做与“第 2 部分”完全相同的事情,以下示例也会按预期填充列表。我有变量,我正在更改变量的值,我正在添加这个变量列出来。
int new_val; List<int> _lst = new List<int>(); for (int i = 0; i < 10; i++) { new_val = i; _lst.Add(new_val); } for (int i = 0; i < _lst.Count(); i++) { Console.WriteLine("ListIdx: " + i.ToString() + " Value: " + _lst[i].ToString()); }有人可以详细说明我的问题吗?
【问题讨论】: