所以我写了一个简单的计时器类
public class ConsoleTimer : IDisposable
{
private Stopwatch _watch;
private IList _items;
public object Count = "0";
public ConsoleTimer(IList items) {
_watch = new Stopwatch();
_items = items;
_watch.Start();
}
public void Dispose() {
var c = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.Green;
_watch.Stop();
TimeSpan ts = _watch.Elapsed;
Console.WriteLine(String.Format("{0} items in {1}m {2}s", _items != null ? _items.Count : Count, ts.Minutes, ts.Seconds));
Console.ForegroundColor = c;
}
}
正如您所看到的,我接受可选的构造函数参数(IList),以便在我的计时器范围内更改该列表时,我可以自动写出添加了多少项(行/记录/实体等)。 / p>
使用如下:
using (ConsoleTimer t = new ConsoleTimer(_values)) {
_values = GetValues(filter);
}
即使_values有955个项目,我的计时器的Dispose方法仍然会将_items视为构造函数中传递的值(无论是0还是null)
是_items = items赋值而不是引用赋值?
答案 0 :(得分:5)
但是您要为_values
分配一个_items
无法看到的新引用!更好的说法
foreach(var value in GetValues(filter)) {
_values.Add(value);
}
现在您正在修改原始参照物,以便_values
和_items
看到更改。
答案 1 :(得分:0)
_items = items;是一个参考作业。问题是你指向了两个不同的对象。
using (ConsoleTimer t = new ConsoleTimer(_values)) { // _values points to collection1
_values = GetValues(filter); // Now _values points to collection2
}
您的ConsoleTimer实例仍指向collection1。你想做_values.Add()或_values.AddRange()。
答案 2 :(得分:0)
问题是你有IList,让我们称之为IList1。您的_values
引用了此实例。当您将_values
传递给构造函数时,您的ConsoleTimer _items
现在是对IList1的引用,不是 _values
。
现在您更改_values
以便 it 引用新实例,将其命名为IList2。您的_items
仍然引用了IList1实例,它不会在引用中跟随_values
。