c#引用分配未按预期工作

时间:2010-11-11 21:29:10

标签: c# .net oop inheritance

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

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赋值而不是引用赋值?

3 个答案:

答案 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