C #: Debug.Assert () со сложным условием - PullRequest
3 голосов
/ 11 ноября 2019

Я пишу библиотеку, где внутри она использует ConcurrentQueue. В одном из методов private я хочу убедиться, что элемент, который у меня есть в данный момент, - это элемент, который будет снят с хранения (т. Е. Если я неправильно написал свои коды, это должно быть ожидаемым поведением). Как мне это правильно утверждать?

Моя текущая попытка:

#if DEBUG
    object peeked = null;
    queue.TryPeek(out peeked);
    Debug.Assert(peeked == itemThatWillBeDequeued);
#endif

Что мне кажется довольно странным - если мне нужно использовать директиву #if, то у меня не будетб Debug.Assert(). Тем не менее, я никак не мог напрямую поместить это ConcurrentQueue.TryPeek() в оператор assert. Кроме того, выполнение этого inline, вероятно, будет означать, что ConcurrentQueue.TryPeek() будет запускаться в выпуске во время выполнения (если я не ошибаюсь).

Каким должен быть правильный способ сделать это?

Ответы [ 2 ]

3 голосов
/ 11 ноября 2019

Если вы хотите избежать дополнительного метода, предложенного Бэконом, вы можете использовать выражение LINQ:

Debug.Assert(((Func<object>)(() => {
    object peeked;
    return queue.TryPeek(out peeked) ? peeked : null;
}))() == itemThatWillBeDequeued);

Объяснение: ((Func<object>)(() => { ... })) создаст объект функции из прилагаемого кода. () выполнит эту функцию и вернет свой результат.

2 голосов
/ 11 ноября 2019

Вы можете заключить вызов в метод

Debug.Assert(itemThatWillBeDequeued.equals(PeekQueue(queue)));

...

static object PeekQueue(ConcurrentQueue queue)
{
  object peeked = null;
  queue.TryPeek(out peeked);
  return peeked;
}
...