2. Lazy - #2
Conversation
| else | ||
| { | ||
| throw new InvalidOperationException( | ||
| "Failed to initialize the lazy value. The supplier delegate is unavailable."); | ||
| } |
There was a problem hiding this comment.
можно убрать лишнюю вложенность, если перенести эту часть выше с условием if (this.supplier is null)
Хотя на мой взгляд это избыточно -- уже проверяете supplier при создании объекта, а в дальнейшем состояние объекта, когда либо suppplier = null и isCalculated=true, либо supplier не null -- это уже его инвариант
| private readonly Lock lockObject = new(); | ||
| private Func<T>? supplier = supplier ?? throw new ArgumentNullException(nameof(supplier)); | ||
| private T? value; | ||
| private bool isValueCreated; |
There was a problem hiding this comment.
Чтобы снизить количество блокировок, стоит isInitialized пометить как volatile, чтобы потоки смотрели на актуальное значение, а не на значение в своих кешах
| [Test] | ||
| public void Get_Should_ReturnCorrectValue_ForInt() | ||
| { | ||
| foreach (var lazy in GetLazyImplementations(() => 42)) |
There was a problem hiding this comment.
Для таких случаев можно атрибут TestCaseSource использовать, чтобы руками меньше писать
| { | ||
| threads[i] = new Thread(() => | ||
| { | ||
| results.Add(lazy.Get()); |
There was a problem hiding this comment.
чтобы просимулировать одновременный запуск потоков, используйте manualResetEvent или Barrier
|
|
||
| #pragma warning disable CS1591 | ||
| #pragma warning disable SA1600 | ||
| public class LazyMockTests |
There was a problem hiding this comment.
Эти тесты сейчас проверяют, что моки правильно работают :)
В остальном окей
No description provided.