调试断言条件逻辑和语言特性

时间:2011-04-19 10:23:00

标签: .net logic vocabulary

我不是以英语为母语的人,所以对我而言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

我错过了什么吗?

你看到这是否直观?

5 个答案:

答案 0 :(得分:3)

你的语法是正确的,但是这样想吧

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

这将断言Me.Member is Nothing,并且只会在不是时提醒您。 有点像你是在争论,你说“地球是75%的水”。没有太多人会与你争论。但如果你说“地球主要由巧克力蛋糕组成。”人们会争辩。

Assert也是如此,如果断言为真,则不需要调试器说出来。如果它是假的,它需要让你知道。

顺便说一下,我是英语母语人士,我写过断言的前几次,我把它们写回来了:)

答案 1 :(得分:1)

Debug.Assert的API确实有点反直觉。我花了很长时间才习惯这个。在我的脑海中,Assert翻译为:

if (condition)
{
    Fail(message);
}

但事实上,它转化为:

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

或简称:

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

诀窍是布尔表达式应为true 而不是来断言。不过我觉得这个设计已经被选中了,因为这个API已经为C ++开发人员提供了很长时间,并且交换它会让他们眼花缭乱。

答案 2 :(得分:0)

关键是你对Assert方法的假设有点偏离标准。

我的意思是,该函数检查条件是否有效,即TRUE。所以它肯定了条件。

如果不满足条件,即FALSE,则显示消息。

答案 3 :(得分:0)

使用Assert,验证代码中的逻辑。 (可选)如果断言失败,您可以添加消息以帮助调试。

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

(抱歉C ++代码。)

答案 4 :(得分:0)

你没有遗漏任何东西。也许设计师应该调用方法“IfNot”而不是“Assert”。我想他们并不是说Assert调用被读作“if”语句。 “断言”作为检查值的方法名称在C / C ++中也有很长的历史,所以我猜他们想在C#中使用相同的名称。