2012-01-05 20 views
17

जबकि कोड पुनर्रचना मैं सभी नहीं तो बातिल की स्थिति बदल बजायजब उपयोग करने के लिए!() या! = जब नहीं तो अशक्त

if (!(foo == null)) 

की मेरी कोड में बहुमत का पालन

if (foo != null) 
को

क्या कोई कथन में कोई फायदा है?

क्या सी # में किसी भी कथन में कोई फायदा है?

+0

धन्यवाद सभी, फिर से प्रतिक्रिया कर सकते हैं: -/ –

उत्तर

26

मुझे दूसरा एक और पठनीय लगता है।

इसके अलावा, कोई अंतर नहीं है।

आपकी टीम के साथ एक सम्मेलन चुनना और किसी विशेष कोडबेस के भीतर चिपकना अधिक महत्वपूर्ण है।

+8

अधिक पढ़ने योग्य। –

+0

और इसके अलावा जब आप पहले परिदृश्य में कोड पढ़ रहे हैं तो आप क्रियाओं को देख सकते हैं (बराबर और नहीं) लेकिन दूसरे में यह "दोस्ताना पढ़ने" और आप एक ही क्रिया की तरह समझते हैं। – Samich

+0

@ ओडेड: सहमत हैं "दूसरा एक (* थोड़ा *) अधिक पढ़ने योग्य" अपेक्षाकृत पहले के लिए, लेकिन यह है, आईएमएचओ, वे मेरे उत्तर में वैकल्पिक सुझाव के सापेक्ष और सापेक्ष कारणों के प्रकाश में बहुत अपठनीय हैं 12/21/17 नीचे। साथ ही, अक्सर "सम्मेलन", जो उस समय ज्ञान और परिस्थितियों के आधार पर पूरी तरह से ठीक हो सकते हैं, नए ज्ञान और/या स्थितियों के प्रकाश में पूरी तरह से अपर्याप्त हैं। – Tom

10

मान लीजिए कि आपने ==/!= ऑपरेटर ओवरलोड को तोड़ दिया नहीं है, तो मैं सादगी/पठनीयता के लाभ के लिए दूसरे फॉर्म का उपयोग करूंगा। आप भार के हड्डी टूट गई है दोनों के बीच एक अर्थ अंतर है ऐसी है कि कर है, तो मैं उन भार के :)

दुर्लभ मामले में जहां foo == null कुछ का एक स्पष्ट संकेत है में फिक्सिंग सुझाव देंगे, मैं शायद refactor था यह एक स्थानीय चर का उपयोग करने के लिए:

bool somethingIsMissing = foo == null; 
if (!somethingIsMissing) 
{ 
    ... 
} 

कोष्ठक दौर foo == null अब वैकल्पिक हैं - उपयोग या नहीं, स्वाद के अनुसार। मुख्य बात यह है कि आप अर्थपूर्ण अर्थ को वास्तव में साफ़ करने के लिए चर नाम का उपयोग कर सकते हैं।

+0

आईएमएचओ, अभी भी 12/21/17 दिनांकित मेरे उत्तर में वैकल्पिक सुझाव के संबंध में और उससे संबंधित कारणों के प्रकाश में बहुत अपठनीय है। – Tom

+0

@ टॉम: मुझे लगता है कि हमें असहमत होने के लिए सहमत होना होगा। मैं सामान्य, बेवकूफ दृष्टिकोण का उपयोग करना चाहूंगा जो किसी भी डेवलपर्स को आश्चर्यचकित नहीं करेगा। –

2

मेरी राय में, कोई फर्क नहीं पड़ता है, संकलक वैसे भी कोड को अनुकूलित करेगा। लेकिन मैं if(foo != null) पसंद करूंगा। कम कोष्ठक और पढ़ने के लिए आसान है।

5

सामान्य रूप से if (!(foo == null)) उदाहरण

if (!(f1 == 'a' && f2 != 'b')) 

के लिए, आप विचारशील के लिए और अधिक चर है जब प्रयोग किया जाता है कभी कभी इस तरह कि विपरीत करने के लिए सब कुछ को बदलने और भी आसान है, खास तौर पर जब आप बिटवाइज़ ऑपरेटर्स का उपयोग कर।

+5

मैं शायद उस मामले में स्पष्ट होने के लिए 'if (f1! = 'A' || f2 == 'b') का उपयोग करूंगा। –

+0

आपके पास बड़ी श्रृंखला है और विशेष रूप से झंडे के साथ: -/यह अधिक "पठनीय" है जैसे 'if (! (E.Row.RowType == DataControlRowType.DataRow && (e.Row.RowState और DataControlRowState.Edit) = = DataControlRowState.Edit)) 'नहीं?जैसे कि 'डेटारो या संपादित प्रकार नहीं है ...' – balexandre

+0

यह ऐसी स्थिति है जहां मैं शायद एक सार्थक नाम के साथ स्थानीय चर में स्थिति को अलग कर दूंगा। –

5

पहला दो ऑपरेटरों का उपयोग करता है, दूसरा दूसरा उपयोग करता है। तो तकनीकी रूप से, दूसरा आसान है।

+0

लेकिन ऑपरेटर के अनुशंसित कार्यान्वयन ' ! = '' वापसी है! (ए == बी) '। तो यह हुड के नीचे ही करता है। – Oliver

+1

यह कहने जैसा है कि एक कार की तुलना में मोटरसाइकिल ड्राइव करना आसान है, क्योंकि इसमें कम पहियों हैं। – Sjoerd

1

मेरा पसंदीदा एक दूसरा है, क्योंकि यह पहले की तुलना में थोड़ा अधिक सुगम है।

वे कोई फर्क नहीं पड़ता है, इसलिए यह आपके लिए पसंद का विषय है।

हालांकि, अगर आपके पास खंड में बहुत से अन्य चर हैं, तो पहले उपयोग करने वाला एक हो सकता है।

अंत में आपकी पसंद।

3

केवल जगह है जहाँ मैं प्रयोग करेंगे !(a == b) इस तरह की तरह != के ऑपरेटर कार्यान्वयन के भीतर होगा:

public static bool operator != (MyType a, MyType b) 
{ 
    return !(a == b); 
} 
0

के बाद से, पहले प्रपत्र 2 बनाम 1 सी # ऑपरेटर्स का उपयोग करता है, यह अधिक करने के लिए संकलन हो सकता है हालांकि, अधिकांश उपयोग मामलों में सीआईएल कोड का सामना करना पड़ता है, यह शायद एक महत्वपूर्ण कोड आकार या प्रदर्शन अंतर नहीं बनाएगा।

महत्वपूर्ण अंतर बनाने की संभावना क्या है पठनीयता और इसलिए लिखने/संशोधित करते समय त्रुटियों का मौका। मैं (और आप शेल्डन अब अपनी आंखों को कवर करना चाहते हैं) "!" के उपयोग से बचें ऑपरेटर कॉम-पूरी तरह से। "गैस्प! मेरा - शब्द!" हाँ, मैंने यह कहा। और मुझे यह चाहिए! एक पास के साथ! यह याद रखना बहुत आसान है क्योंकि यह अक्सर इसके बायीं तरफ एक समान दिखने वाले विराम चिह्न (यानी "(") के बराबर होता है और इसके समान दिखने वाले पहचानकर्ता पत्र (यानी "मैं") के दाईं ओर होता है। और गायब होने से इसका मुख्य परिणाम हो सकता है, क्योंकि इसका मतलब यह होगा कि आपको लगता है कि यह कोड वास्तव में क्या कर रहा है, इसका सटीक ओपोज़ाइट कर रहा है! और यह डिस्लेक्सिक्स द्वारा मिस्डिक्स द्वारा संभावित रूप से विकलांगता अधिकार समस्या को दूर करने की संभावना अधिक हो सकती है।

पर विचार करें बहुत संभावना उदाहरण का पालन करना:

if (false.Equals(IsIisServerConnected)) 
    if 
    (
    IsOfflineMode 
    || false.Equals 
    (
     IsIisLocalServerConnected 
     || IsIisCloudServerConnected 
    ) 
    ) 
:

if (!IsIisServerConnected) 
    if (IsOfflineMode || !(IsIisLocalServerConnected || IsIisCloudServerConnected)) 

मैं बजाय निम्नलिखित लिखते थे

या आपके मामले में:

if (false.Equals(foo == null)) 

याद रखें कि सी (भाषा है कि सी #, सी ++, जावा स्क्रिप्ट, जावा और कई अन्य वर्तमान में लोकप्रिय भाषाओं अंततः उनके बुनियादी वाक्य रचना से विरासत में मिली) एक में बनाया गया था वह समय जब पंच कार्ड अभी भी आम थे। आधुनिक दिन सीपीयू, रैम, मॉनीटर और आईडीई के साथ ("झूठी। एक्वाल्स (?)" स्निपेट कस्टम कीबोर्ड शॉर्टकट के साथ उत्पन्न किया जा सकता है), ज्यादातर लोगों के लिए अधिकांश लोगों के लिए, पठनीयता बहुत अधिक है, बहुत (मैंने इसका उल्लेख किया है " कुछ कोड अक्षर सहेजने से ज्यादा "?) अधिक महत्वपूर्ण है।

पीएस आप Boolean पर एक एक्सटेंशन विधि भी जोड़ सकते हैं, इसे कॉल करने के लिए, ओह, मुझे नहीं पता, Not! ; डी तो आप लिख सकते हैं:

if (IsIisServerConnected.Not()) 
if ((foo == null).Not()) 
संबंधित मुद्दे