簡體   English   中英

調試斷言條件邏輯和語言特性

[英]Debug Assert condition logic and language peculiarities

我不是母語為英語的人,所以對我來說, Debug.Assert方法有點奇怪,對我來說,驗證一個條件,實際上驗證了這個條件的反面。

斷言 =推進,肯定,爭辯,證明,aver,聲稱,宣告,宣傳,發音,提出,說,壓力等

我期待,那個

Debug.Assert(Me.Member Is Nothing, "Member Is Nothing!")

表現得像

Affirm(condition, "Message") ' conditional message

但是,實際上我應該這樣做

Debug.Assert(Me.Member Is Nothing, "Member Is NOT Nothing!")

Affirm(NOT condition, "Message") ' counter-conditional message

我錯過了什么嗎?

你看到這個直觀與否?

你有正確的語法,但這樣想

Debug.Assert(Me.Member Is Nothing, "Member assert.")

這將斷言Me.Member is Nothing ,並且只會在不是時提醒您。 有點像你是在爭論,你說“地球是75%的水”。 沒有太多人會與你爭論。 但如果你說“地球主要由巧克力蛋糕組成。” 人們會爭辯。

對於Assert也是如此,如果斷言為真,則不需要調試器說出來。 如果它是假的,它需要讓你知道。

順便說一句,我是一個以英語為母語的人,前幾次我寫了斷言語,我向后寫了:)

Debug.Assert的API確實有點違反直覺。 我花了很長時間才習慣這個。 在我的腦海里, Assert翻譯成這個:

if (condition)
{
    Fail(message);
}

但事實上,它轉化為:

if (condition)
{
    // Success
}
else
{
    Fail(message);
}

或簡而言之:

if (!condition)
{
    Fail(message);
}

訣竅是布爾表達式應為true 而不是斷言。 不過我認為這個設計已經被選中了,因為這個API已經為C ++開發人員提供了很長時間,並且交換它會讓他們眼花繚亂。

關鍵是你對Assert方法的假設有點偏僻。

我的意思是,該函數檢查條件是否有效,即TRUE。 所以它肯定了條件。

如果不滿足條件,即FALSE,則顯示消息。

使用Assert ,可以驗證代碼中的邏輯。 (可選)如果斷言失敗,您可以添加消息以幫助調試。

int i = 3;
i *= 3;
assert(i == 9, "Strange arithmetic failure");

(抱歉,C ++代碼。)

你沒有遺漏任何東西。 也許設計師應該調用方法“IfNot”而不是“Assert”。 我想他們並不是說Assert調用被讀作“if”語句。 “斷言”作為檢查值的方法名稱在C / C ++中也有很長的歷史,所以我猜他們想在C#中使用相同的名稱。

暫無
暫無

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

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