今天早些时候,当我编写一个方法时,我发现我不确定为什么我正在实现的成语编译.如果其他一切都被抽象掉了,它看起来像这样:
private int Example()
{
while (true)
{
if (some condition)
{
return 1;
}
}
}
Run Code Online (Sandbox Code Playgroud)
你有一个显式无限循环,循环内部的一些条件导致循环以return语句结束.让我们暂时忽略为什么我这样做,而不是检查while子句中的终止条件,因为答案是错综复杂且无关紧要的 - 我想知道的是为什么编译器不会将此标记为"Not"所有路径都返回一个值." 错误,严格地说并非所有路径都返回值.永远不会输入while循环(当然,从未发生过)的情况不会返回任何内容.
现在,我可以想象它发生的原因有两个:这是由于其他原因而发生的优化的副作用,或者这种情况显然由编译器处理以允许这个习惯用法.我的直觉是它可能是第一种情况.例如,这根本不会让我感到惊讶:
private int Example2()
{
if (true) return 1;
}
Run Code Online (Sandbox Code Playgroud)
因为编译器在if中看到一个常量true,并优化条件.我不明白为什么这会"修复"第一个例子.
哦,甚至更奇怪的是,如果摆脱循环的一些优化正在发挥作用,这将编译:
private int Example3()
{
while (true)
{
if (false)
{
return 1;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我认为整个内部循环将被优化掉,摆脱所有有效的回报.在字节码/编译器级别实际上是什么让这一切都有意义?
以下功能是 Chrome 中的错误,还是我不理解的正确行为?
在 Chrome(版本 25)中,如果我有一个内容可编辑的跨度,它通过一个 :after css 类在它后面添加了一个节点,就像在这个 jsfiddle 中一样
如果我删除了跨度的所有内容,在我删除了最后一个字符后,Chrome 会<br>向内容可编辑跨度添加一个。这感觉不对。
我已经验证,如果 :after css 内容未添加,Chrome 不会执行此操作,并且我已验证 Firefox 在任何情况下都不会执行此操作。
如何统计c#应用程序中屏幕上按下的总键数?就像应用程序在后面运行而我正在输入...然后我可以看到我按下了多少键.谢谢.