2012-03-12 3 views
9

愚かな質問かもしれませんが、Math.Signを使用する理由はありますか?C#(< or If >の場合)対Math.Sign

if文を使用するのではなく、Math.Signを使用して速度/最適化の問題がありますか?たぶんベストプラクティス/コードの可読性の好みですか?

if (rayDirX < 0) 
    stepX = -1; 
else 
    stepX = 1; 

//---------- 

stepX = (rayDirX < 0) ? (-1) : (1); 

//---------- 

stepX = Math.Sign(rayDirX); 
+2

私はこのメソッドがかなり無意味だと思う唯一の人ではないのでとても嬉しいです。 – MikeTheLiar

+0

メソッド名は代数式よりも説明的であり、エラー。 –

答えて

3

機能的な違いがあるかどうか、またはもしあれば、perfの違いは疑わしいですが、Math.Signのバージョンは少し目立つほど単純です。特に、あなたの例では、rayDirXの型が宣言されていません。しかしそれはかなり微妙で、私はあなたのどちらかを使って批判しません。

EDIT:

そしてもうひとつは、あなたの上記の例では、わずかなバグがあります。 0の場合、Math.Signは0を返します。ここでMath.Signためのフレームワークのうち、逆コンパイルコードは次のとおりです。

public static int Sign(int value) 
{ 
    if (value < 0) 
    { 
    return -1; 
    } 
    if (value > 0) 
    { 
    return 1; 
    } 
    return 0; 
} 
4

Math.Signは、より大きな式の一部として使用できます。また、三項演算子を使って式に使用する記号を得ることもできますが、三項演算子はすべてが読めるとは限りません。

+1

3進版もそうです。 –

0

私はそのほとんどが読みやすさの問題だと思います。私は参照の中に何か違いがあることを指摘していませんでした。しかし、Joelが言ったように、Math.sign(rayDirX)は、if式や条件式よりも大きな式の一部として使用するほうがはるかに簡単です。

4

機能上の違いがあります。Math.Signには3つの戻り値があり、入力が0の場合は0が返されます。(単精度の)3項演算子ではこれを行うことはできません。

Source)はまた、メソッド名は、代数的表現よりも説明的であり、反復およびエラーの可能性を防止するための定数をカプセル化します。

+1

'rayDirX <0?だが、2つの3項式で1つの式を使うことができる。 -1:rayDirX> 0? 1:0; ' –

関連する問題