簡體   English   中英

C#:Debug.Assert() 條件復雜

[英]C#: Debug.Assert() with complex condition

我正在編寫一個在內部使用ConcurrentQueue的庫。 在其中一種private方法中,我想確保我當前擁有的項目是將出隊的項目(即,如果我沒有錯誤地編寫代碼,這應該是預期的行為)。 我該如何正確斷言?

我目前的嘗試是:

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

這對我來說看起來很奇怪 - 如果我需要使用#if指令,那么我就不會使用Debug.Assert() 但是,我也無法直接將ConcurrentQueue.TryPeek()直接放入 assert 語句中。 此外,內聯可能意味着ConcurrentQueue.TryPeek()將在運行時以發行版運行(除非我弄錯了)。

正確的方法應該是什么?

如果你想避免培根建議的額外方法,你可以使用 LINQ 表達式:

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

說明: ((Func<object>)(() => {... }))將從隨附的代碼中創建一個 function object。 ()將執行此 function 並返回其結果。

您可以將調用包裝在一個方法中

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

...

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM