2009-10-23 19 views
5

मैं बस कुछ कोड पर काम कर रहा था और अपने आप को इस त्रुटिसी # ऑपरेटरों और पठनीयता

if (stringName == "firstName" || "lastName") 
    // Do code 

बनाने पकड़ा स्पष्ट रूप से यह गलत है और

if (stringName == "firstName" || stringName == "lastName") 
    // Do code 

होना चाहिए, लेकिन यह सिर्फ मुझे के संबंध में सोच कर ली पठनीयता पहली बार आसान हो जाएगा? हो सकता है कि कुछ तर्क हो जो कहें कि जब तक कोई नया स्ट्रिंग नाम निर्दिष्ट नहीं होता है, तो पहले का उपयोग करें?

वास्तव में कोई सवाल नहीं है, अगर ऐसा कुछ है जो मैं इस तरह के एक बयान को संकलित करने के पीछे तर्क पर पूरी तरह से समझ नहीं पा रहा हूं तो बस उत्सुक हूं।

+0

आप ऑपरेटर ओवरलोडिंग का उपयोग कर सकते हैं। उदाहरण के लिए, आप एक कक्षा बना सकते हैं जिसमें स्ट्रिंग्स की सूची शामिल है (हम इसे foo कहते हैं), ऑपरेटर ओवरलोडिंग का उपयोग करें: स्ट्रिंग बनाएं || स्ट्रिंग रिटर्न फू (जाहिर है, कंटेनर में स्ट्रिंग के साथ) और foo बनाएं || स्ट्रिंग को स्ट्रिंग और वापसी foo जोड़ना चाहिए। (इसलिए आप स्ट्रिंग || स्ट्रिंग || स्ट्रिंग का उपयोग कर सकते हैं) तो आप स्ट्रिंग == foo ओवरलोड कर सकते हैं ताकि आप अंततः उनकी तुलना कर सकें। तो, संक्षिप्त जवाब? ऑपरेटर ओवरलोडिंग चट्टानों! –

उत्तर

10

समस्या

मैं इसे करने का तरीका पसंद रूबी यह है कि अगर बुलियन पर काम करता है।

stringName == "firstName" एक बूलियन लौटाता है।
"lastName" एक स्ट्रिंग अक्षर है।

|| एक छोटा सर्किट बूलियन या ऑपरेटर है जो दोनों तरफ बूलियन लेता है।

दूसरे शब्दों में, आप || की परिभाषा को बदलना चाहते हैं जो आम तौर पर एक बुरा विचार है।

सिद्धांत रूप में, आप पार्सर का अनुमान लगा सकते हैं कि आपका क्या मतलब है ... लेकिन यह बहुत जल्दी अस्पष्ट हो जाता है।

if (stringName == firstName || lastName) 

ठीक दिखता है, है ना? लेकिन आखिरी नाम क्या है?

यदि मैंने ऐसा किया तो क्या होगा?

const bool lastName = false; 

इसके अलावा, &&|| के विपरीत है, लेकिन stringName == firstName && lastName ऊपर तर्क के विपरीत नहीं है, और वास्तव में कोई मतलब नहीं होगा।

if ((stringName == "firstName") || (stringName == "lastName")) 
    // Do code 

एक के बाद जब यह दूसरा स्वभाव बन जाता है:

+0

वह अंतिम पंक्ति ठीक वही है जो मैं याद कर रहा था। –

1

कारण इस तरह के वाक्यविन्यास की अनुमति नहीं थी कारण पठनीयता की वजह से सबसे अधिक संभावना थी। यदि आप पहली बार कोड देख रहे हैं, और आप बिल्कुल सही दिमाग में नहीं हैं, तो आप शायद यह नहीं देख पाएंगे कि आप stringName दोनों "firstName" और "lastName" से तुलना कर रहे हैं। यह सिर्फ आपके इरादे को और अधिक परिभाषित करता है।

फिर फिर, कोष्ठक इसे हल कर सकते हैं।

1

यह केवल तभी काम करेगा जब operator||(string,string) लौटाया गया .. स्ट्रिंग का एक प्रकार का संग्रह और आपके पास Equals ओवरलोड था जो स्ट्रिंग और स्ट्रिंग का संग्रह लेता था और सत्यापित करता था कि स्ट्रिंग संग्रह में है। लगता है कि बहुत ही कम इस्तेमाल किए गए निर्माण के लिए दृश्यों के पीछे बहुत सारे काम किए गए हैं।

खासकर के बाद से आप पहले से ही की तरह कुछ कर सकते हैं: प्रोग्रामर की मंशा पर संकलक अनुमान के बाद जब कोड है ताकि इसे ठीक करने के लिए स्पष्ट रूप से गलत है

if(new string[]{"firstName","lastName"}.Contains(stringName)) 
    // code 
+1

मुझे वास्तव में लगता है कि इससे पहले की तुलना में कम पठनीय है। –

+0

यह स्वाद का विषय है। यदि आपने कहा कि यह अपर्याप्त है, तो मैं सहमत हूं, यह कुछ मूल्यों की तुलना करने के लिए एक सरणी बनाता है। – Blindy

+0

एक ही तकनीक अन्य भाषाओं में निश्चित रूप से अधिक पठनीय है: 'यदि स्ट्रिंगनाम ("फर्स्टनाम", "अंतिम नाम") में है ... '(पायथन) –

6

एक सच में, सच बुरा विचार है।

+0

सहमत है कि यह गलत है और संकलक अनुमान लगाना गलत है लेकिन यह और कैसे हो सकता है इरादा? –

+0

शायद आप किसी अन्य चर 'अन्य स्ट्रिंगनाम' का उपयोग करना चाहते हैं - संकलक को कैसे पता चल रहा है? – tvanfosson

+0

मैं देख रहा हूं कि आप क्या कह रहे हैं, यह अनावश्यक लगता है। धन्यवाद! –

11

मुझे लगता है कि आपका प्रस्ताव अभिव्यक्ति पार्सिंग के नियमों को गड़बड़ कर देगा - अब, '==' बाइनरी के बजाए एक चतुर्भुज (?) ऑपरेटर बन जाता है। मैंने पाया अपने आप एसक्यूएल के 'में ऑपरेटर लापता है, हालांकि, and've कुछ इस तरह इस्तेमाल किया:

string[] ValidNames = new string[] { "firstName", "lastName"}; 

if(ValidNames.Contains(stringName)) 
{ 
    //Do Code 
} 
+0

या इसे सामान्य बनाएं: ' में (यह टी मान, पैरा [टी मान] पैरामीटर' – Lucas

+0

@ लुकास: उत्कृष्ट सुझाव! शामिल। –

1

मैं शामिल() फ़ंक्शन इस समस्या को हल करती है यानी लगता है एसक्यूएल को सिंटैक्स की तरह नहीं मानें:

if(stringName in ("firsName", "lastName")) 
{ 
} 
1

मैं wouldn:

if (stringName.In("foo", "bar", "baz")) 
{ 

} 

// in an extension method class 
public static bool In<T>(this T value, params T[] values) 
{ 
    return values.Contains(value); 
} 
+1

पाइथन की तरह दिखता है। –

+0

आपका उत्तर ओपी के सुझाए गए वाक्यविन्यास में त्रुटियों की बजाय प्रश्न के इरादे को संबोधित करता है, इसलिए +1। – Greg

+0

पेट्रोट्टा के ऊपर का जवाब देखें: http://stackoverflow.com/questions/1615800/c-operators-and-readability/1615835#1615835 – Lucas

2

यहां तक ​​कि ब्रांड्स के साथ, यह समझ में नहीं आता है। stringName == ("firstName" || "lastName") ऐसा लगता है कि आप दो तारों की सच्चाई का परीक्षण करना चाहते हैं, और वे तार हमेशा सत्य होने जा रहे हैं, और उसके बाद उस बूलियन परिणाम की तुलना स्ट्रिंग stringName से करें।

आप इस (stringName == "firstName") || "lastName" तरह कोष्ठकों जोड़ते हैं, तो हालत भी हमेशा की तरह, सच होना "lastName" हमेशा सच है के बाद से किया जाए या नहीं के बराबर होती है stringName"firstName" की परवाह किए बिना जा रहा है।

["firstName", "lastName"].include? stringName 

तुम हमेशा Contains इस्तेमाल कर सकते हैं दूसरों की तरह का सुझाव दिया है या तुम कर सकते हो, जहां के लिए एक स्ट्रिंग विस्तार विधि लिखें::

stringName.EqualsOneOf(new[] {"firstName", "lastName"}) 
0

यही कारण है कि, एक आदत के रूप में, मैं हमेशा करते हैं।

0

जब एफसीएल में इस धागे में दिखाई देने वाले विभिन्न प्रकार के उत्तरों को बनाने के लिए समृद्धि होती है, तो आपको अधिक लचीला सी # वाक्यविन्यास रखने की आवश्यकता नहीं होती है क्योंकि पठनीयता जल्द ही एक विशेषता बन जाती है कि आप सभी समृद्धि के बीच जवाब कैसे बनाते हैं । यह विधि और ऑब्जेक्ट कॉल के बीच अधिकतर विकल्पों के बीच विकल्पों को उबालता है।

तारों की एक सरणी में एक या एक से अधिक तारों को एक साथ खोजने में सक्षम होने के लिए या स्ट्रिंग के उस सेट में फिट होने वाले किसी भी अन्य मानदंड को लागू करने के लिए यहां एक उदाहरण (केवल कई में से एक) है। किसी भी कोड के लिए, इस कोड नमूने को समझने के लिए इंडेंटेशन, रिक्ति और कोड टिप्पणियां एक बड़ा हिस्सा निभाती हैं।

 bool found = Array.Exists(
      // array of strings to search 
      new[] { "c#", ".net", "programming", "design patterns", "work", "play", "bits", "bytes", "break" }, 
      // criteria - can even satisfy multiple conditions simultaneously if desired 
      str => (str == ".NET" || str == "work") //look for ".NET" or "work" 
      ); 
संबंधित मुद्दे