Невозможно добавить элемент в свойство Collection.Пожалуйста, помогите мне, пожалуйста - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь добавить элемент в SynchronizedCollection, но он работает, только если я добавляю его непосредственно в поле.

        _s = new SynchronizedCollection<int>();
        _s.Add(01010);
        S.Add(123);

    private SynchronizedCollection<int>  _s;
    public SynchronizedCollection<int> S
    {
        get
        {

            lock (_s.SyncRoot)
            {
                return new SynchronizedCollection<int>(_s.SyncRoot, _s);
            }
        }

        private set
        {
            _s= value;
        }
    }

Как заставить это работать?

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Один из вариантов - открыть публичный метод AddItem, который принимает int и добавляет его в ваше личное поле:

public void AddItem(int item)
{
    _s.Add(item);
}

Очевидно, что вы могли бы также вернуть закрытое поле _s в методе get вместо его копии, и тогда клиенты могли бы вызывать Add непосредственно в закрытом поле через эту ссылку, но тогда нет особого смысла в этом быть частным. :)

1 голос
/ 23 апреля 2019

это работает, только если я добавляю его непосредственно в поле

Поскольку вы не присваиваете только что созданный SynchronizedCollection для _s.Каждый раз, когда вы вызываете S getter, создается новая коллекция, все элементы копируются , и элемент добавляется в нее._s на самом деле остается нетронутым.

lock (_s.SyncRoot)
{
    _s = new SynchronizedCollection<int>(_s.SyncRoot, _s);
    return _s;
}

Хотя я не думаю, что это необходимо для создания новой коллекции каждый раз, SynchronizedCollection сам по себе является потокобезопасным, поэтому вы можете просто вернуть _s, но нене знаю фактического сценария, почему вы это делаете.

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