代码之家  ›  专栏  ›  技术社区  ›  Sonic Soul

参考分配没有按预期工作

  •  2
  • Sonic Soul  · 技术社区  · 15 年前

    所以我写了一个简单的计时器类

    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),以便在计时器范围内更改该列表时,我可以自动写出添加了多少项(行/记录/实体等)。

    使用方法如下:

            using (ConsoleTimer t = new ConsoleTimer(_values)) {
                _values = GetValues(filter);
            }
    

    即使'u values有955个项,我计时器的Dispose方法仍然将'u项视为在构造函数中传递的值(无论是0还是null)

    项目分配不是参考分配吗?

    3 回复  |  直到 15 年前
        1
  •  5
  •   jason    15 年前

    但你在给 _values 不会被看到的 _items ! 最好说

    foreach(var value in GetValues(filter)) {
        _values.Add(value);
    }
    

    现在修改原始引用,以便 _价值观 _项目 查看更改。

        2
  •  0
  •   James Kovacs    15 年前

    _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()的操作。

        3
  •  0
  •   CodingGorilla    15 年前

    问题是你有IList,我们称之为IList1。你的 _values 引用此实例。当你经过的时候 _价值观 给你的构装师,你的安慰者 _items 现在是对IList1的引用, _价值观 .

    现在你变了 _价值观 以便 references是一个新实例,称之为IList2。你的 _项目 仍然 引用IList1实例,它不遵循 _价值观 作为参考。