在C#中,赋值表达式将LHS操作数的值作为值返回:
int i;
while ((i = foo()) > 5) { ... }
这在C风格的语言中通常很方便,也很惯用。但是,它也可能导致难以发现错误,例如:
if ((options == (__WCLONE|__WALL)) && (current.hasUid = true)) retval = -EINVAL;
// Also consider the case of a nullable bool
特别是在安全关键代码中,我想在编译使用此语言功能的代码时至少生成警告。
我应该怎么做?我是否必须为代码检查工具创建自定义规则?
编辑修复:之前,错误的示例错误地使用了int赋值而不是bool赋值。
更新:我同意x = true
是多余的,并会引发上述错误。编写良好的代码不应表现出允许出现这种错误所必需的条件。
特别是我想通过检查(以自动方式)所涉及的问题来确保不会发生这些情况。这增加了在问题进入之前捕获问题的机会。
答案 0 :(得分:5)
首先,编写if (aBoolVar == true)
是多余的。只写if (aBoolVar)
(而不是if (aBoolVar == false)
,请写if (!aBoolVar)
。)
在C#中使用Yoda conditions会无缘无故地损害可读性。 if (val = 0)
根本不会编译(好吧,除非val
是GunThatShootsBothForwardAndBackwardSimultaneously
类型的变量,它具有从int
到bool
的隐式转换运算符。 。),所以这不是问题。
答案 1 :(得分:3)
正如Mormegil指出的那样,至少C#的惯用方法是仅仅评估属性而不是将其与true进行比较(例如current.hasUid
) - 尽管对于bool?
比较你可能想做的事情nullableBool == true
代替nullableBool ?? false
。
如果这仍然不够,您可以通过在项目属性的“构建”部分中启用“将警告视为错误”并输入以下错误代码来强制C#编译器使情况出错: {3}}: 0665