【问题标题】:What is the difference between these two following approaches?以下两种方法有什么区别?
【发布时间】:2014-09-23 10:10:00
【问题描述】:

我有以下代码 sn-p。

bool b = false;
if (b) {}

但我看到很多人写过类似的东西:

if (true == b){}

它们在我看来都一样,这里有什么区别吗?

【问题讨论】:

  • 是的,第二个是先计算一个布尔值是否等于另一个布尔值,然后在结果上应用 if 语句......当然编译器可能首先删除这一步
  • 顺便说一句,我相信好的做法是写 if (b) 或 if (b != false) - 如果是 bool 类型, if (b == true) 肯定也可以,但仅从历史原因(在 C 中,当 true 通常简单地定义为“非 0”时)在我看来有点“更干净”......但同样,在 C# 中,if (b == true) 肯定是好的,如果 b 保证它是 bool
  • 一切都与可读性和程序员的风格有关

标签: c# boolean


【解决方案1】:
bool b;
if (b) {}

您不能使用它,因为 C# 编译器不允许使用未分配的局部变量。

另一方面,两者没有区别

bool b = true;
if (b) {}

bool b = true;
if (true == b){}

它们也会生成相同的MSIL 代码。但在我看来,第二个例子中的平等检查是不必要的。这就是为什么if(b) 看起来比if(true == b) 干净。

【讨论】:

    【解决方案2】:

    对我来说

    if (true == b){}
    

    很不优雅。 遵循这种风格代替

    if (a == b){}
    

    你应该放

    if ((a == b) == true){}
    

    等等……

    【讨论】:

      【解决方案3】:

      不,没有区别。 (好吧,除了我想的打字字母的数量)。

      bool b = true; //ensure you initialise it though!! (if it was **C** you wouldn't think not to!)
      

      所以;

      if(b)
      {
       //doSomthing...
      } 
      

      表示

      if(true)
      {
       //doSomething...
      }
      

      但是,

      如果 b 被赋值为 false,那么 if 语句将被跳过;像这样:

      bool b = false;
      if(b)
      {
      //this won't be executed since b is false
      }
      

      不过,至于您的问题,如果您在开头初始化 b,那么是的,它们将是相同的

      【讨论】:

      • 是的,正如我的评论中所解释的那样,有区别,没有if(b) 并不意味着,它的意思是“如果 b 为真”
      • 如果 b 被赋值为 true,那么是的,这确实意味着 if(true) 不是?
      • 不,它不会,因为 b 可以重新分配为 false 这将跳过 if 语句,if(true) 将始终进入语句。
      • 因此,如果 b 被分配为 false,那么是的,它会跳过......但我明白你的意思 - 现在会澄清
      【解决方案4】:

      代码:

      bool b = true;
      if (b) 
          Console.WriteLine("b-ok");
      if (b==true)
          Console.WriteLine("b-true");
      

      如果我们检查第一个 if

      的 IL-CODE
      IL_000b:  ldloc.0
      IL_000c:  ldc.i4.0
      IL_000d:  ceq
      IL_000f:  stloc.1
      IL_0010:  ldloc.1            
      IL_0011:  brtrue.s   IL_001e 
      IL_0013:  ldstr      "b-ok"   
      IL_0018:  call       void [mscorlib]System.Console::WriteLine(string)  
      IL_001d:  nop
      

      对于第二个如果

      IL_001e:  ldloc.0
      IL_001f:  ldc.i4.0
      IL_0020:  ceq
      IL_0022:  stloc.1
      IL_0023:  ldloc.1
      IL_0024:  brtrue.s   IL_0031
      IL_0026:  ldstr      "b-true"
      IL_002b:  call       void [mscorlib]System.Console::WriteLine(string)
      IL_0031:  ....
      

      我们可以清楚地看到 C# 编译器为这两个语句生成相同的 IL 代码。因此,这两种方法完全相同。

      【讨论】:

        【解决方案5】:

        if 语句需要一个布尔表达式(条件)为true,以便执行其块内的指令。如果您将一个布尔值与另一个布尔值进行比较,您仍然会得到一个布尔结果,但是,除非您将两个布尔变量与一个未知值进行比较,否则您可能正在编写一段无用的代码。 为了更好地解释我自己:

        bool a, b;
        
        // some computation
        
        if(a == b)
        {
            // do stuff
        }
        

        有道理,而

        bool a;
        
        // some computation
        
        if(a == true)
        {
            // do stuff
        }
        

        包含一些无用的代码(在我看来,它甚至失去了一些可读性),因为它相当于:

        bool a;
        
        // some computation
        
        if(a)
        {
            // do stuff
        }
        

        【讨论】:

          猜你喜欢
          • 2015-02-12
          • 1970-01-01
          • 2018-11-12
          • 2013-09-08
          • 2019-03-31
          • 1970-01-01
          • 1970-01-01
          • 2020-02-14
          相关资源
          最近更新 更多