5

私は書いています:

if(Class.HasSomething() == true/false) 
{
  // do somthing
}
else
{
  // do something else
}

しかし、私は反対のことをする人々も見ました:

if(true/false == Class.HasSomething())
{
  // do somthing
}
else
{
  // do something else
}

パフォーマンスと速度の点でどちらか一方を行うことに利点はありますか?ここではコーディングスタイルについて話しているのではありません。

4

9 に答える 9

15

どちらも同等ですが、私の好みは

if(Class.HasSomething())
{
  // do something
}
else
{
  // do something else
}

...簡単にするために。

于 2012-05-03T15:49:23.293 に答える
11

一部の古いスタイルのCプログラマーは、「ヨーダ記法」を好みます。これは、代わりに誤って単一の等号を使用すると、定数への割り当てに関してコンパイル時エラーが発生するためです。

if (true = Foo()) { ... }  /* Compile time error!  Stops typo-mistakes */
if (Foo() = true) { ... }  /* Will actually compile for certain Foo() */

その間違いはC#でコンパイルされなくなりますが、古い習慣は一生懸命に死に、多くのプログラマーはCで開発されたスタイルに固執します。


個人的に、私はTrueステートメントの非常に単純な形式が好きです。

if (Foo()) { ... }  

しかし、Falseステートメントの場合、明示的な比較が好きです。
短いものを書くと、後でコードをレビュー!Foo()するときに見落としがちです。!

if (false == Foo()) { ... }  /* Obvious intent */
if (!Foo())  { ... }         /* Easy to overlook or misunderstand */
于 2012-05-03T15:53:16.100 に答える
5

2番目の例は、私が聞いた「ヨーダ記法」です。「誤り、このメソッドの戻り値はでなければなりません」。それはあなたが英語でそれを言う方法ではないので、英語を話すプログラマーの間では一般的に見下されています。

パフォーマンスに関しては、実際には違いはありません。最初の例は一般的に文法的に(したがって読みやすさのために)優れていますが、メソッドの名前を指定すると、関連する「文法」(およびboolとboolを比較しているという事実)により、とにかく等価性チェックが冗長になります。したがって、本当のステートメントの場合、私は単に次のように書きます。

if(Class.HasSomething()) 
{
  // do somthing
}
else
{
  // do something else
}

if()ブロックには基本的に等価比較が組み込まれているため、これは段階的に高速になります。したがって、コーディングif(Class.HasSomething() == true)すると、CLRはを評価しif((Class.HasSomething() == true) == true)ます。しかし、ここではおそらく数クロックのゲインについて話しています(ミリ秒ではなく、ティックではなく、クロック。最近のプロセッサでは1秒間に20億回発生するものです)。

if(!Class.HasSomething())false条件の場合、not演算子:を使用することとfalse:との比較を使用することの間のトスアップですif(Class.HasSomething() == false)。1つ目はより簡潔ですが、複雑な式の小さな感嘆符を見逃しがちです(特に、式全体の前に発生するため)。したがって、コードが読みやすいことを確認するためにfalseと同等にすることを検討します。

于 2012-05-03T15:48:47.677 に答える
1

パフォーマンスの違いは見られません。

正しいオプションは

if (Whatever())

あなたが書くべきである== falseか、または!= trueを扱うときだけですbool?。(この場合、4つのオプションはすべて異なる意味を持ちます)

于 2012-05-03T15:49:34.253 に答える
1

パフォーマンスの違いは見られません。どちらの比較も同じILに変換されます...

于 2012-05-03T15:49:39.110 に答える
1
if(Class.HasSomething()) 
{
  // do somthing
}

私のやり方です。ただし、の複数のメソッド呼び出しは避けてくださいHasSomething()。戻り値を一度公開して再利用することをお勧めします。

于 2012-05-03T15:50:58.350 に答える
1

どちらも書くべきではありません。

書く

if(Class.HasSomething())
{
    // do something
}
else
{
    // do something else
}

代わりは。がすでにブール値である場合Class.HasSomething()、それを別のブール値と比較するのは無意味です

于 2012-05-03T15:51:14.243 に答える
0

ここにはパフォーマンス上の利点はありません。このコーディングスタイルは、プログラマーが==ではなく=と入力する状況を防ぐために使用されます。true / falseは定数であり、新しい値を割り当てることができないため、コンパイラはこれをキャッチします

于 2012-05-03T15:51:18.053 に答える
0

ブール値の場合は、どちらもお勧めしません。とを使用するだけif (method())ですif (!method())。ブール値以外の場合、たとえば、yoda-speakを使用する規則は、if (1 == x)ミスを防ぐために発生しました。これif (1 = x)は、コンパイラエラーがスローif (x = 1)されないのにスローされるためです(Cでは有効なコードですが、おそらく意図したものではありません)。C#では、このようなステートメントは、変数がブール値である場合にのみ有効であるため、その必要性が少なくなります。

于 2012-05-03T16:02:02.760 に答える