M A*_*ifi 2 c# lazy-evaluation
我一直听说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));
}
Run Code Online (Sandbox Code Playgroud)
打印多少次"论证是真的!" 到屏幕?
我会说7是正确的答案.现在,如果我坚持使用编译器并运行它,它会打印出来的10次数!懒惰的评价哪里出错了?
Jon*_*eet 38
我一直听说C#使用懒惰评估.
对我来说,这个评论太过模糊了.如果你说C#中的||和&&运算符是短路的,只考虑第二个操作数,如果整个结果不能仅从第一个操作数确定,那么我同意它.延迟评估是一个更广泛的概念 - 例如,LINQ查询使用延迟(或延迟)评估,而不是在使用结果之前实际获取任何数据.
您正在使用的&运营商,这是不是短路:
&运算符评估两个运算符,而不管第一个运算符的值.
该&&操作 是短路:
该操作
x && y对应于操作,x & y除了ifx为false,y不进行评估,因为无论值y是什么,AND操作的结果都是假的.
更换&用&&无处不在你的代码,你会看到"的说法是真的!" 打印8次(不是7次 - 再次计算您的评论).
| 归档时间: |
|
| 查看次数: |
7573 次 |
| 最近记录: |