C# 我如何通过测试来证明这是否短路?

C# 我如何通过测试来证明这是否短路?,c#,C#,考虑以下表达式: if(!(A || B)) 我不确定这是否会以同样的方式短路 if(!A && !B) 会吗 如果是这样,我将如何编写一个测试来验证这一点?编写一个测试,其中a和B是返回布尔值并具有某种副作用的方法(例如设置属性)。然后,您的测试可以检查A是否设置了属性,而B没有设置属性。如果你不想要正式的测试,你可以使用类似.NETFiddle的东西 下面是一个简单的示例,说明您正在尝试执行的操作 在这种情况下,“短路”仅意味着当A为真时,您不计算B。一种简单的测试方法是

考虑以下表达式:

if(!(A || B))
我不确定这是否会以同样的方式短路

if(!A && !B)
会吗


如果是这样,我将如何编写一个测试来验证这一点?

编写一个测试,其中
a
B
是返回布尔值并具有某种副作用的方法(例如设置属性)。然后,您的测试可以检查
A
是否设置了属性,而
B
没有设置属性。如果你不想要正式的测试,你可以使用类似.NETFiddle的东西

下面是一个简单的示例,说明您正在尝试执行的操作

在这种情况下,“短路”仅意味着当
A
真时,您不计算
B
。一种简单的测试方法是将
B
设为一种方法,只要其计算结果为
true
,就可以随意设置
a
,然后查看是否调用了
B
方法。您可以通过在调试器中运行代码并设置断点,或通过在
B
中设置标志,或将其设置为控制台程序并在
B
中调用
console.WriteLine(“调用的B方法”)

我希望这足以让你明白这个想法


而且,作为记录,这两个表达式应该以完全相同的方式短路。也就是说,当
A
true
时,
B
不会被计算。

当涉及到逻辑和一些变量时,我喜欢使用真值表

因此,要做到这一点,您必须:

如果要进行单元测试断言,可以使用A和B的四种组合以及测试来查看这两种情况是否相等

要在C#和Visual Studio中使用单元测试,请右键单击要进行测试的方法,然后选择“创建单元测试”,如下所示:

这将创建一个仅用于单元测试的附加项目

在这种情况下,方法是等价的(a,b)根据所讨论的语句是否等价,返回true或false

因此,看看我们的单元测试代码,您可以这样填写测试方法:

[TestMethod()]
    public void IsEquivalentTest()
    {
        Assert.IsTrue(Program.IsEquivalent(false, false));
        Assert.IsTrue(Program.IsEquivalent(false, true));
        Assert.IsTrue(Program.IsEquivalent(true, false));
        Assert.IsTrue(Program.IsEquivalent(true, true));
    }
该测试方法现在断言,对于AB的每个输入组合,等效性测试方法是否返回true

如果是这样,我们就知道这些语句是等价的

要运行测试,请右键单击并选择“运行测试”。 这将打开测试资源管理器,它将指示所有断言都已通过


这与真值表相符。

@MattL。如果第一个表达式为
true
,则
|
无需继续求值,因此它将短路@马特尔。“如果第一个操作数的计算结果为true,则第二个操作数将不计算。”@PeterDuniho,我和Joe Sewell的回答都不是针对OP,而是针对一个“Matt L”,他在随后删除了一条注释。他说,
|
操作员总是评估两侧,从不短路。那句话不正确。@CraigW.:啊,我明白了。错过了
'L'
。注意:我误解了这个问题!很抱歉。尽管如此,我还是会留下这个答案,以防万一它会帮助别人!