这么简单的问题还写?先不要笑。打开你代码量最多的项目,搜索|
或者&
,看看有多少条这样的代码!
前不久,我在dotnet/machinelearning上提交了一个pull request。修改内容是把"|"改成"||", 把"&"改成"&&"。
你猜包含多少修改?总共46个文件,近200处修改!!!
为什么是问题
简单来说,这些都是二元逻辑运算符。只是"|"和"&"运算符始终计算两个操作数,"||"和"&&"运算符仅在必要时才计算右侧操作数。
问题就出在始终计算上。
对于下面的代码,你觉得有什么问题:
private void Test(User user)
{if (user == null | user.Name == ""){Console.WriteLine("公众号“My IO”");}
}
当程序运行时,如果碰到user对象为null,还是会计算user.Name,这会导致NullReferenceException
。而编译时不会有任何问题,因为是符合语法的。
因此,做逻辑判断时,应始终使用"||"和"&&"运算符。
什么时候用"|"和"&"
为整形做位运算,也就是对1/0的运算,才是它们应该起作用的位置:
var method = type.GetMethod("MethodName", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
结论
其实,大多数这种错误是输入错误造成的。只是显示不明显,而且编译器也不会做任何提示,所以容易被忽略,成为潜在的错误(相信微软的程序员水平不会那么低的)。
个人建议,尽量使用静态代码扫描工具,可以有效减少或避免这类问题的发生。
如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“,记住我!