Кажется очень странным каждый раз возвращать разные объекты ... на самом деле, я очень редко (если вообще когда-либо) использую подход SyncRoot, так как часто мне нужно синхронизировать несколько объектов и т. Д., Поэтому отдельный объект более осмыслен.
Но если данные действительно неизменны (только для чтения), почему бы просто не вернуть false из IsSynchronized?
Re GC - любой такой объект обычно будет недолговечным и будет собран в GEN0. Если у вас есть поле с объектом (для блокировки), оно будет длиться столько же, сколько и коллекция, но, скорее всего, не повредит ...
Если вам нужен замок, я бы просто соблазнил:
private readonly object lockObj = new object();
Вы также можете использовать ленивый подход только для «нового» его при необходимости, что имеет определенный смысл, если вы на самом деле не ожидаете, что кто-либо попросит синхронизировать блокировку (возвращая false для IsSynchronized).
Другой распространенный подход - вернуть «это»; это делает вещи простыми, но рискует конфликтовать с некоторым другим кодом, использующим ваш объект в качестве блокировки для несвязанной цели. Редко, но возможно. Это именно тот подход, который [MethodImpl]
использует для синхронизации.