我一直听说 C# 使用惰性求值。所以对于某些代码,比如if (true || DoExpensiveOperation()
将返回true
不执行DoExpensiveOperation()
.
在面试测试中我看到了以下问题,
static bool WriteIfTrue(bool argument)
{
if (argument)
{
Console.WriteLine("argument is true!");
}
return argument;
}
static void Main()
{
// 1 0 0 1
WriteIfTrue((WriteIfTrue(false) & WriteIfTrue(true)) || WriteIfTrue(true));
// 1 1 0 1
WriteIfTrue((WriteIfTrue(true) || WriteIfTrue(false)) & WriteIfTrue(true));
// 0 0 0 0
WriteIfTrue((WriteIfTrue(false) & WriteIfTrue(true)) & WriteIfTrue(false));
// 1 1 0 1
WriteIfTrue((WriteIfTrue(true) || WriteIfTrue(false)) & WriteIfTrue(true));
}
它会打印多少次“argument is true!”到屏幕上?
我会说7
是正确的答案。现在,如果我坚持编译器并运行它,它会打印它10
次!惰性评估到底错在哪里?
我一直听说 C# 使用惰性求值。
这个评论太模糊了,我无法同意。如果你说的是||
and &&
C# 中的运算符是短路的,如果仅从第一个操作数无法确定总体结果,则仅计算第二个操作数,then我同意。惰性求值是一个更广泛的概念 - 例如,LINQ 查询使用惰性(或延迟)求值,在使用结果之前不会实际获取任何数据。
您正在使用, which isn't短路:
& 运算符计算两个运算符,无论第一个运算符的值如何。
The is短路:
操作x && y
对应操作x & y
除了如果x
是假的,y
不进行计算,因为无论 AND 运算的值是什么,结果都是 falsey
is.
Replace &
with &&
在代码中的任何地方,您都会看到“argument is true!”打印了 8 次(不是 7 次 - 再次计算您的评论)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)