[英]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.