2012-03-12 7 views
9

एक मूर्ख सवाल हो सकता है, लेकिन क्या Math.Sign का उपयोग करने का कोई कारण है?सी # (यदि < or If >) बनाम Math.Sign

क्या कोई कथन का उपयोग करने के बजाय 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 संस्करण थोड़ा और स्पष्ट रूप से सीधे आगे है। खासकर आपके उदाहरण में जहां रेडिरिक्स का प्रकार घोषित नहीं किया गया है। लेकिन यह बहुत सूक्ष्म है और मैं आप का उपयोग करने के लिए आलोचना नहीं करता।

संपादित करें:

और एक दूसरी बात, अपने उदाहरण से ऊपर एक मामूली बग है। 0 MathSign के मामले में 0 वापस आ जाएगा। Math.ign के लिए ढांचे से बाहर संकुचित कोड यहां दिया गया है:

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

Math.Sign का उपयोग बड़े अभिव्यक्ति के हिस्से के रूप में किया जा सकता है। आप टर्नरी ऑपरेटर के माध्यम से अभिव्यक्ति में उपयोग के लिए संकेत भी प्राप्त कर सकते हैं, लेकिन सब कुछ नहीं सोचता है कि टर्नरी ऑपरेटर सभी पठनीय है।

+1

तो टर्नरी संस्करण कर सकते हैं। –

0

मुझे लगता है कि यह ज्यादातर एक पठनीयता समस्या है। मैंने संदर्भ में कुछ भी नहीं देखा जो किसी भी मतभेद को इंगित करता है। लेकिन जोएल ने कहा, Math.sign (RayDirX) एक बड़ी अभिव्यक्ति के हिस्से के रूप में उपयोग करना बहुत आसान है कि अगर ब्लॉक या सशर्त अभिव्यक्ति।

4

एक कार्यात्मक अंतर है: Math.Sign में तीन संभावित वापसी मान हैं, और यदि इनपुट 0 है तो शून्य वापस आ जाएगा। आप इसे (एकल) टर्नरी ऑपरेटर के साथ नहीं कर सकते हैं।

(Source)

इसके अलावा, एक विधि नाम एक बीजीय अभिव्यक्ति की तुलना में अधिक वर्णनात्मक है, और स्थिरांक समाहित पुनरावृत्ति और त्रुटि के लिए संभावना को रोकने के लिए।

+1

क्या आप इसे दो में से दो टर्नरी अभिव्यक्तियों के साथ कर सकते हैं हालांकि 'rayDirX <0? -1: रेडिरिक्स> 0? 1: 0; ' –

संबंधित मुद्दे