检查变量的捷径不等于两个数字
本文关键字:两个 数字 变量 捷径 不等于 检查 | 更新日期: 2023-09-27 18:21:45
我必须检查writerId是否等于0或1。这是我写的。
int writerId = foo();
if(writerId != 0 && writerId != 1)
{
// do something
}
有什么简单的方法可以写出相同的if语句吗?
这很短,但很难理解:
if ((writerId & ~1) != 0)
writerId & ~1
操作取消设置数字中的最低有效位——在该操作之后,只有1和0两个数字等于0,因此如果结果不是0,则它一定不是0或1。
然而,您正在严重牺牲可读性。有时,最短的代码并不是最可读的。我会坚持你所拥有的。
如果在查看这段代码时考虑可读性。。你总是可以把它移到自己的布尔方法中,这样它在其他代码的上下文中读起来更好:
bool IsValid(int writerId) {
return writerId != 0 && writerId != 1;
}
那么你的代码至少可以读得更好一点:
if (IsValid(writerId)) {
// do something
}
我将把该方法的适当命名留给您。如果没有更简单的方法使代码读起来更好而不变得更复杂,我通常会这样做。
你可以试试这个:
if (foo() >> 1 != 0)
{
// do something
}
这是我日常工作中经常发生的事情。我在某个时候为它写了一个扩展:
public static class GenericExtensions
{
public static bool EqualsAny<T>(this T value, params T[] comparables)
{
return comparables.Any(element => object.Equals(value, element));
}
public static bool EqualsNone<T>(this T value, params T[] comparables)
{
return !EqualsAny(value, comparables);
}
}
所以你可以写(!writerId.EqualsAny(0, 1))
或(writerId.EqualsNone(0, 1))
而不是(writerId != 0 && writerId != 1)
。在这种情况下,我可能不会使用EqualsNone方法,因为它实际上降低了可读性。无论如何,我可能根本不会在这种情况下使用这种方法。它主要有助于提高长枚举名称的可读性,因为长枚举名称会导致长行或换行。和往常一样,这无论如何都是一个意见问题。)