2011-02-08 17 views
1

いここ清潔切り札性能:場合... ELSE IF()対使用

バージョン1:

Function MyFunc(ByVal param as String) As String 
    Dim returnValue as String 
    If param Is Nothing Then 
     returnValue = "foo" 
    Else 
     returnValue = param 
    return returnValue 

バージョン2:箱なしStringで1つの取引直接

Function MyFunc(ByVal param as String) As String 
    return If(param,"foo") 

バージョンs。バージョン2はすべてのボックス付きObjectを扱います。 COMMENT
[コメントを追加することはできません] [)(場合オブジェクトとしてとしてTestExpression、FalsePartを取り、オブジェクトを返す]

を:ja72、私の命名を修正しました。
コメント:Marc、バージョン2に行くのですか?

+3

ボックス化された/ボックス化されていない文字列はありません。ボクシングは、 'object'としてアクセスされる値の型にのみ適用されます。文字列は参照型ですが、そこには**オブジェクトがありません。最後に、VBはヌル合体演算子を持たないのですか? C#では 'return param? "foo"; ' –

+2

@Marc Gravel +1。 VB.Netには??、あなたがそれを見ている。 if(obj1、obj2)。 :) –

+0

参照してくださいhttp://stackoverflow.com/questions/4619593/is-the-null-coalesce-operator-thread-safe - それはC#のですが、洞察力があるはずです(最初の返信を参照)。同じことを行ってVB.NET ILを検査することもできます。 –

答えて

7

明瞭さは何よりも優先されます。

If(obj1,obj2)関数は、VB.NETのヌル併合演算子です。 C#でobj1 ?? obj2と同じ機能を果たします。そのため、誰もが何を意味するのかを知っておく必要があり、簡潔さが重要な場合はそれを使うべきです。

If/Elseの文は、きれいでシンプルで明白ですが、この特定のケースでは、私はIf機能を好むでしょう。

+1

私はあなたと一緒にいます。私は、いつもこれが何を意味するのか疑問に終わるよりも長いものを読んでいます。 –

+0

はい、コードを読み取り可能なままにし、最適化をコンパイラに任せます。プロファイラを使用して、CPUを食べることが判明した場合は、コードを再訪してください。 –

+0

(C#で)私は?ほとんどの場合、より多くの「明確な」形態をとる。ビジュアルキューの違いかもしれません。しかし、私がVB.NETを使用した場合は、ツールのレパートリー(3引数* 3値if演算子*と同様)に* if演算子*を追加する可能性があります。それは愚かなオーバーロードされた名前を使用する場合でも、ほとんど "トリッキーな操作"です。すべてのif/then構文は式ではありません:-) [コンパイラは指定された名前の関数を呼び出すのではなく適切なILを発行できるので演算子です。] –

1

私は、これらの2つの実装がほぼ同じであると信じています。もう少し短いので、2番目の実装を使用します。

3

コンパイラは、これらの2つを最適化レベル(プロジェクトプロパティを参照)に応じて同じコードまたはほぼ同じものに最適化します。

この方法で2つの方法を書いてコンパイルし、Reflectorを使用してVB.Netの逆コンパイル済みコード(またはMSIL)を調べると、非常にわずかな(数十億分の1) 。

通常、コンパイラの最適化は、if文とループをさまざまな方法で書くことができる通常のパターンを処理します。たとえばfor .Net for、foreach、while、doなどは実際には存在しません。これらは、アセンブリレベルでgoto-statementロジックにコンパイルされた言語固有の機能です。リフレクターを使ってこれらのいくつかを見ると、たくさんのことを学べます! :)

コンパイラが最適な状態に最適化できない悪いコードを書くことが可能であり、コンパイラよりも優れたコードを書くことも可能です。 .NetアセンブリとMSILを理解することは、コンパイラをよりよく理解することを意味します。

+0

実際にはC#に微妙な違いがあり、VBで似ていると想像していますが、私はILを見ていませんでした。 C#でILの?演算子は、最初にテスト値の* copy *を実行します。これにより、スレッド間でも* * x ?? "not-null"は* nullを返すことはありません*(適切なスレッドセーフティの代わりになるはずはありません) –

+0

これは興味深いかもしれません:http://stackoverflow.com/questions/4619593/is-the-null- coalesce-operator-thread-safeこれはILを示しています。なぜなら、実際にはC#の場合でも、それは実際にはまともなSOのビットだと思います。うーん、しかし、最適化する能力を持って、私は知らない... –

+0

Strict in OnおよびIf()がObject型を返す場合、返す前に文字列にキャストする必要はありませんか? – eych

2

本当に?私はこの機能がどんなアプリケーションでもボトルネックになるとは思わないので、簡潔さと明快さだけで行きます。

私が推薦する:

Public Function TXV(ByVal param As String) As String 
    Return If(param Is Nothing, "foo", param) 
End Function 

をし、(型の安全性を保つために)関数は、文字列を返すことを確認してください。ところで、あなたのファンクションMySubと呼ばれていますか? MyFuncではありませんか?

+2

1つのように見えますが、それは機能ではありません! 'If​​f'は関数です。 'If​​(a、b)'と 'If(a、b、c)'は演算子であり、ILをコンパイルするためにコンパイルされます。それは単に関数のように見えます。しかし、明快なコメントのための+1。 –

+0

私の悪いです。最初は 'Iff()'で投稿し、コメントを変更せずに変更しました。 – ja72

0

私はCのバックグラウンドから来ているので、何が起こっているのかが分かりやすいところで、三項演算子を最も頻繁に選ぶでしょう。このような場合は繰り返しがあり、慣用的な場合があります。同様に、COALESCE(a、b、c、d、e)を使用して一連の条件文を避け、最初のNULL以外の値を取るT-SQLでは、これは慣用的で簡単に読み取ることができます。

古いIIf関数は新しいIf演算子とは異なるので、新しい関数が副作用と短絡を適切に処理する一方で、人々が長い間警戒し続けてきたまったく異なる動作から1文字だけ離れていることに注意してください。

http://secretgeek.net/iif_function.asp

http://visualbasic.about.com/od/usingvbnet/a/ifop.htm

私はオプティマイザは、変換のこれらの種類についてかなり良いですので、パフォーマンスの面では問題になるだろうとは思いません。

関連する問題