1

我不是以英语为母语的人,所以对我来说有点奇怪的Debug.Assert方法,对我来说,验证一个条件,事实上,验证这个条件的反面。

Assert = 推进、肯定、争论、证明、平均、声称、宣称、自称、发音、提出、说、强调等

我希望,

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

我错过了什么吗?

你看到这个直观吗?

4

5 回答 5

3

你有正确的语法,但这样想

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

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

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

顺便说一句,我的母语是英语,前几次我写断言语句时,我是倒着写的:)

于 2011-04-19T10:27:18.307 回答
1

的 APIDebug.Assert确实有点违反直觉。我花了很长时间才习惯这一点。在我的脑海中Assert翻译成这样:

if (condition)
{
    Fail(message);
}

但实际上,它翻译为:

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

或简而言之:

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

诀窍是布尔表达式应该为真而不是断言。我认为无论如何选择了这个设计,因为这个 API 已经为 C++ 开发人员提供了很长时间,并且交换它会让他们眼花缭乱。

于 2011-04-19T10:30:14.197 回答
0

关键是您对该Assert方法的假设有点离题。

我的意思是,该函数检查条件是否有效,即 TRUE。所以它断言这个条件。

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

于 2011-04-19T10:26:57.330 回答
0

使用Assert,您可以验证代码中的逻辑。或者,您可以添加一条消息以帮助在断言失败时进行调试。

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

(对不起 C++ 代码。)

于 2011-04-19T10:30:02.127 回答
0

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

于 2011-04-19T10:33:21.300 回答