ссылка c # не работает должным образом - PullRequest
2 голосов
/ 12 ноября 2010

поэтому я написал простой класс таймера

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 или ноль)

является ли присвоение _items = items не ссылочным присвоением?

Ответы [ 3 ]

5 голосов
/ 12 ноября 2010

Но вы назначаете новую ссылку на _values, которая не будет видна _items!Проще говоря,

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

Теперь вы модифицируете исходный референт, чтобы и _values, и _items увидели изменения.

0 голосов
/ 12 ноября 2010

Проблема в том, что у вас есть IList, назовем его IList1. Ваш _values ссылается на этот экземпляр. Когда вы передаете _values своему конструктору, ваш ConsoleTimer _items теперь является ссылкой на IList1, , а не _values.

Теперь вы изменили _values, чтобы it ссылался на новый экземпляр, назовите его IList2. Ваш _items все еще ссылается на экземпляр IList1, он не следует за _values в ссылке.

0 голосов
/ 12 ноября 2010

_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 ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...