【问题标题】:c# reference assignment not working as expectedc# 引用分配没有按预期工作
【发布时间】:2010-11-11 21:29:09
【问题描述】:

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

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);
        }

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

_items = items 分配不是参考分配吗?

【问题讨论】:

    标签: c# .net oop inheritance


    【解决方案1】:

    但是您正在为_values 分配一个新的引用,_items 不会看到它!最好说

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

    现在您正在修改原始引用对象,以便 _values_items 看到更改。

    【讨论】:

      【解决方案2】:

      _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】:

        问题是你有 IList,我们称之为 IList1。您的 _values 引用了此实例。当您将 _values 传递给您的构造函数时,您的 ConsoleTimer _items 现在是对 IList1 的引用,不是 _values

        现在您更改_values 以便it 引用一个新实例,称为IList2。您的 _items 仍然 引用了 IList1 实例,它没有遵循 _values 的引用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-30
          • 2016-06-11
          相关资源
          最近更新 更多