2009-04-05 15 views
2

こんにちは私は(速度および/または効率の問題で)書く方が良いです何を考えていた:速度(C#の)

bool Method(...) { ... } 

... 

bool result = Method(...); 

if (result == false) 
{ ... } 
// or 

if (!result) 
{ ... } 

か、あるいは...

if (result == true) 
// or 

if (result) 

私は最初のもの(result == false)を使用しているので、特にcondition ? expr : expr文で非常に長くなることがあるので、私は尋ねています。

+0

問題と密接な、しかし、私はそれを使用する必要がある場合、私は、他の方法でラウンドそれを記述しない、すなわち、(偽==結果)(無偶然の書き込み)。 – dirkgently

+0

そして、読みやすさが低下するだけです。 – Noldorin

答えて

1

私は違いはないと思いますが、もしあれば、おそらくそれを測定するのに苦労するでしょう。差異は測定のノイズにある可能性があります。

9

個人的には、result == falseのようなものが見えるときはいつも私はうんざりします。これは、私の意見では平等演算子のかなり面倒な誤用であり、まったく必要ありません。私は、コンパイラが2つの式を同じバイトコードに変換する必要があると思いますが、間違いなく!resultを使用したいと考えています。実際、より直接的かつ論理的な表現であるだけでなく、言及したように、コードを短くて読みやすくすることができます。私はこの時点で大多数のC#コーダーが私に同意すると思います。

+0

私はif(result == false)と書くのは主にif(!result)より読みにくいからです。それは、私がすぐに比較されるものを見ているからです。 –

+1

私は、どこから来ているのか分かります(何年も前に同じことをする傾向がありました)が、実際にはブール値とif文がどのように機能するかについての誤解から生じています。 !resultを使用するだけですぐに使えるようになります - すぐにあなたはもっと*明白に見えます! – Noldorin

+0

ええ、私は元VB6の開発者(約3年)です。私はC#(VBよりはるかに優れた構文)に調整しました。さて、ときどき私はVBで始まったことを後悔しています。私はVBで多くの影響を受けたときに決して「適切な」開発者になれないと思います。(常に厳密に変数を宣言していますが) –

4

ランタイムスピードは同じです。両方のスニペットが同じMSILコード表現にコンパイルされます。

の代わりに(result == false)を使用していますが、

2

ランタイムコードにはパフォーマンスの違いはありません。私が働いていた会社のコーディングガイドラインのほとんどは、好きな結果でした。

1

あなたは間違いなく!演算子ではなく、より速いので、より安全です。

誤っ1の代わりに2つのうち、あなたが代わりに値を比較するの変数に値を代入等号を使用する場合:他のデータ型については

if (result = false) { 

をコンパイラが(id = 42)のような表現として、これをキャッチすることができますは整数値であるため、if文では使用できませんが、(result = false)のような式はブール値を持ち、コンパイラはそれを受け入れる必要があります。

(旧Cのトリックは、それが割り当てすることはできませんようにリテラルを最初に置くことですが、!演算子はより良い代替手段であるので、それが読みにくくなります。)

+0

(result = false)がC#でコンパイルされない場合C#で偶然の書き込みをすることはできません。 –

+0

@Jakob Christensen:それはうまくコンパイルされ、警告を受けるだけです。 – Guffa

+0

あなたはそうです。怖い:-) –

1

私は@Noldorinに同意するが、 if(!result)が好ましいとすれば、データアクセスシナリオで最も頻繁に発生するnull可能なブールをテストする必要がある場合、if(result == false)とそのilkは非常に便利です。

編集:ここでは、null可能なブールで等価演算子を使用するさまざまな方法を説明するサンプルプログラムを示します。

1

私はこのプロセスに3つのステップがあると思います。まず、if(this.isMonkey == true)のバナナを書くために、ifの中に常に比較があるべきだと考えます。食べる();あなたはあれば(this.isMonkey)を依頼する罰金であること、これがあれば、このフォーマットは、「(この例では、文のように、より良い読書を可能にすることを学ぶ

その後

あるいは、より現実的

if(SpeciesSupervisor.getInstance().findsSimilarTo(Monkey.class, 2) == true) { 
    String f = new PropertyBundle("bananarepo").getField("banana store"); 
    EntitiyManager.find(Banana.class,f).getBananas().get(1).eat(); 
} 

、モンキー")。

最後に、あなたは年をとって、(b)があまり読みにくくない場合、そして(b == true)あなたの貧弱な脳に何が起こっているのか、そしてこれらの厳しい要求「悪用」、「虐待」、やadaよだれなどは、すべて誇張されています。

パフォーマンスについては、 Javaでは違いの断片を作ることはありません。私は.NETがそれほど悪くないとは思わない。これはコンパイラが行うことができる最も簡単な最適化です。性能が同じであることをいくらかお金を賭けるでしょう。

乾杯、

ニコ