Bob*_*y B 11 .net c# exception-handling exception truthtable
考虑一下这个函数,您可以将其视为真值表:
public Foo doSomething(bool a, bool b) {
if ( a && b) return doAB();
else if ( a && !b) return doA();
else if (!a && b) return doB();
else if (!a && !b) return doNotANotB();
else throw new Exception("Well done, you defeated boolean logic!");
}
Run Code Online (Sandbox Code Playgroud)
编译器坚持最后一个else子句.但从真相表的角度来看,这是一个不可能的状态.
是的,它有效,是的,我可以忍受它.但是我想知道c#中是否有一些机制来避免这种代码,或者我是否错过了一些明显的东西?
更新:
对于奖励积分,纯粹出于好奇,是否有任何语言以不同的方式处理这类事情?也许这不是一个语言问题,而是一个智能编译器(但我认为边缘情况将是难以想象的复杂).
das*_*ght 18
考虑到真值表,最后一个条件完全是超级流行.可以在不改变程序逻辑的情况下删除它,如下所示:
public MyType doSomething(bool a, bool b) {
if ( a && b) return doAB();
else if ( a && !b) return doA();
else if (!a && b) return doB();
else/*if (!a && !b)*/ return doNotANotB();
}
Run Code Online (Sandbox Code Playgroud)
现在你有一个最后的全部if,你的编译器很高兴.您不必完全删除条件 - 我经常发现在评论中将其保留在可读性中是一个好主意.
if(a) return b ? doAB() : doA();
else return b ? doB() : doNotAnotB();
Run Code Online (Sandbox Code Playgroud)
或更短:
return a ? (b ? doAB() : doA())
: (b ? doB() : doNotAnotB());
Run Code Online (Sandbox Code Playgroud)
试试f#.如果它能够检测到与其匹配指令匹配的穷举条件,则它不需要其他.
http://ganesansenthilvel.blogspot.co.at/2011/12/f-pattern-matching.html?m=1#!
> let testAND x y =
match x, y with
| true, true -> true
| true, false -> false
| false, true -> false
| false, false -> true
> testAND true false;;
val it: bool = true
Run Code Online (Sandbox Code Playgroud)
而且规格不完整
> let testAND x y =
match x, y with
| true, true -> true
// Commented | true, false -> false
| false, true -> false
| false, false -> true
> testAND true false;;
Run Code Online (Sandbox Code Playgroud)
编译器会说
Microsoft.Fsharp.Core.MatchFailureExcption: The match cases were incomplete at:....
Stopped due to error
Run Code Online (Sandbox Code Playgroud)