不要笑!写 | 还是 || ,还真是一个问题

这么简单的问题还写?先不要笑。打开你代码量最多的项目,搜索|或者&,看看有多少条这样的代码!

前不久,我在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“,记住我!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值