Подтвердить что ты не робот

Список <T> не реализует SyncRoot!

Каждый использует много List. Мне нужно перебрать этот список, поэтому я использую известный SyncRoot шаблон.

Недавно я заметил в этом сообщение о том, что SyncRoot следует избегать в пользу "встроенной" безопасности потоков (каждый метод блокирует частный объект, не подвергая его воздействию используя свойство SyncRoot). Я могу это понять, и частично согласен с этим.

Вопрос в том, что List <T> класс не реализует свойство SyncRoot, даже если реализует ICollection, которые отображают свойство SyncRoot. Я говорю об этом, если код

 List<int> list = new List<int>()
 list.SyncRoot;

сообщите мне следующую ошибку компилятора:

ошибка CS0117: "System.Collections.Generic.List" не содержит определения для "SyncRoot"

... Если это так, как я могу синхронизировать общедоступное свойство типа List <T> когда он повторяется?

4b9b3361

Ответ 1

Он фактически реализован явно.

object ICollection.SyncRoot
{
    get
    {
        if (this._syncRoot == null)
        {
            Interlocked.CompareExchange(ref this._syncRoot, new object(), null);
        }
        return this._syncRoot;
    }
}

Это означает, что вы должны использовать ICollection для его использования.