我对这段代码的理解是否正确?

Pur*_*ome 1 c#

我正在审查我们的承包商的一些代码:

if (userLists != null)
{
    Int32 numberOfItems = userLists.Count;
    if ((numberOfItems & 1) == 1)
    {
        var emptyList = new tblList();
        userLists.Add(emptyList);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我正在努力理解这一点,所以,如果我有这个权利,有人可以与我确认吗?

  1. 我们有userList的实例吗?
  2. 是.获取userLists对象中的项目数.
  3. 如果(项目数等于1(是/真)和1等于1(是/真))并且结果等于1(是/真),则将空列表对象添加到列表中.
  4. 别的:没什么.

如果是这样(WTFFFFFFFFFFFFFFFFFFFF !!!!!!!!!!),可以重构为

if (numberOfItems == 1)
{
..
}
Run Code Online (Sandbox Code Playgroud)

但即便如此,因为我不想要一个带有"空"项目的清单.

那么我是否正确阅读了这段代码?

哦,再次感叹使用Int32vs Int:(但我离题了).

Jer*_*ten 6

使用1对数字进行按位与运算,检查数字是奇数还是偶数(如果奇数则返回1).此代码正在执行的操作是,如果存在奇数个项目,则通过添加另一个项目来确保列表具有偶数项目.


Sma*_*ery 6

&就是所谓的按位运算符.而运算符&&测试两个布尔值:

TRUE && FALSE => FALSE
TRUE && TRUE => TRUE
Run Code Online (Sandbox Code Playgroud)

&运营商可以在整数值工作:

  00101101 (45)
& 01011011 (91)
---------------
= 00001001 (9)
Run Code Online (Sandbox Code Playgroud)

每个位都有布尔运算(和).因此,对于您的代码示例,它会询问"最后一位是1吗?" - 也就是说"这很奇怪吗?" 例如,如果数字是23:

  00010111 (23)
& 00000001 (1)
---------------
= 00000001 (1)
Run Code Online (Sandbox Code Playgroud)

所以它添加到列表中因为1 == 1.但如果数字是22:

  00010110 (22)
& 00000001 (1)
---------------
= 00000000 (0)
Run Code Online (Sandbox Code Playgroud)

所以它不会添加到列表中.