【问题标题】:What does the "&=" in this C# code do?这个 C# 代码中的“&=”有什么作用?
【发布时间】:2010-12-29 16:56:31
【问题描述】:

我遇到了一些看起来像这样的代码:

string someString;

...

bool someBoolean = true;
someBoolean &= someString.ToUpperInvariant().Equals("blah");

为什么我要使用按位运算符而不是“=”?

【问题讨论】:

  • 我认为该代码相当丑陋。它更短,但当你真正的意思是逻辑与时,我觉得使用按位有点滥用。另请注意,逻辑并支持短路,因此当someBooleantrue 时,无需计算someString.ToUpperInvariant().Equals("blah");
  • @Brian:应用于布尔值时,它不是按位运算符。
  • @Guffa:是的,你是对的。 The MSDN 实际上明确说明了这一点。我认为标准也是如此。
  • “当应用于布尔值时它不是按位运算符”是什么意思?布尔值不只是一个 1 位数字吗?也就是说,1位按位运算和逻辑布尔运算之间有什么功能区别吗?
  • @JamieTreworgy C# 中的布尔变量存储为 16 位(2 个字节),但其值只能是 0000000000000000 和 111111111111111,所以按位或不按位是相同的。如果 C# 中的 bool 变量可以存储其他值(如 C),那将会有所作为。

标签: c# bitwise-operators


【解决方案1】:

当它应用于布尔运算符时,它不是按位运算符。

同理:

someBoolean = someBoolean & someString.ToUpperInvariant().Equals("blah");

您通常会看到快捷方式和运算符&&,但运算符& 在应用于布尔值时也是一个and 运算符,只是它不做快捷方式。

您可以改用&& 运算符(但没有&&= 运算符)可能会节省一些计算。如果someBoolean 包含false,则不会计算第二个操作数:

someBoolean = someBoolean && someString.ToUpperInvariant().Equals("blah");

在您的特殊情况下,变量在前一行设置为true,因此完全不需要and 操作。您可以只评估表达式并分配给变量。此外,不要转换字符串然后进行比较,您应该使用处理您希望比较的方式的比较:

bool someBoolean =
  "blah".Equals(someString, StringComparison.InvariantCultureIgnoreCase);

【讨论】:

  • 位运算符在应用于 System.Booleans 时仍然是位运算符。但是,由于 C# 将 'true' 设置为 1,因此它们最终具有与布尔运算符相同的真值表。但是,任何非零整数都可以作为有效的真值。有关示例,请参见 dotnetpad.net/ViewPaste/6wYCZ3QmNUClKXiYi113Pw
【解决方案2】:

它相当于& 运算符的+=

【讨论】:

    【解决方案3】:

    简称:

    someBoolean = someBoolean & someString.ToUpperInvariant().Equals("blah");
    

    参见MSDN(&= 运算符)。

    【讨论】:

      【解决方案4】:
      someBoolean = someBoolean & someString.ToUpperInvariant().Equals("blah");
      

      在这种情况下,在 someBoolean 为真之前,意味着

      someBoolean = someString.ToUpperInvariant().Equals("blah");
      

      【讨论】:

        【解决方案5】:

        这是这个的简写形式:

        someBoolean = someBoolean & someString.ToUpperInvariant().Equals("blah")
        

        【讨论】:

          【解决方案6】:

          正如 Guffa 指出的那样,& 和 && 之间是有区别的。我不会说你可以,而是你应该使用 && 而不是 & : & 让你的代码更怪异,但是 && 让你的代码更具可读性......并且性能更高。下面展示了如何:

          class Program
          {
              static void Main(string[] args)
              {
                  Stopwatch Chrono = Stopwatch.StartNew();
                  if (false & Verifier())
                      Console.WriteLine("OK");
                  Chrono.Stop();
                  Console.WriteLine(Chrono.Elapsed);
          
                  Chrono.Restart();
                  if (false && Verifier())
                      Console.WriteLine("OK");
                  Chrono.Stop();
                  Console.WriteLine(Chrono.Elapsed);
              }
          
              public static bool Verifier()
              {
                  // Long test
                  Thread.Sleep(2000);
                  return true;
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2011-12-31
            • 2011-07-18
            • 1970-01-01
            • 2011-12-21
            • 2011-04-13
            • 1970-01-01
            • 2015-07-19
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多