2011-11-25 15 views
9

yield कीवर्ड प्रलेखन कहते हैं:क्या "उपज कीवर्ड" एक इटरेटर ब्लॉक के बाहर उपयोगी है?

उपज कीवर्ड संकलक कि जो यह दिखाई देता हो विधि पुनरावर्तक ब्लॉक है को संकेत।

मुझे किसी भी इटरेटर ब्लॉक के बाहर yield कीवर्ड का उपयोग करके कोड का सामना करना पड़ा है। क्या इसे प्रोग्रामिंग गलती के रूप में माना जाना चाहिए या क्या यह ठीक है?

int yield = previousVal/actualVal; 
return yield; // Should this be allowed!!!??? 

धन्यवाद:

संपादित क्षमा करें मेरी कोड पोस्ट करने के लिए भूल गया था।

+7

** हाँ **, यह बहुत उपयोगी है। – dlev

+4

जो कोई भी "वापसी उपज" के साथ आया था महाकाव्य अनुपात का एक बुरा प्रतिभा है। –

+0

हमारे पास कुछ बहुत अच्छा कोड बेस मैन है! मैंने इस सवाल से पूछा कि मैं इस तरह के कोडिंग के खिलाफ बहस कर रहा था ... मैं यह जानना चाहता था कि समुदाय इसके बारे में क्या सोचता है – GETah

उत्तर

22

यह एक iterator ब्लॉक के बाहर yield उपयोग करने के लिए ठीक है - यह सिर्फ यह एक प्रासंगिक कीवर्ड के रूप में इस्तेमाल नहीं किया जा रहा है इसका मतलब है।

उदाहरण के लिए:

// No idea whether this is financially correct, but imagine it is :) 
decimal yield = amountReturned/amountInvested; 

उस बिंदु यह नहीं एक प्रासंगिक कीवर्ड है, यह सिर्फ एक पहचानकर्ता है (यह कभी नहीं एक "पूर्ण" कीवर्ड है)। जब तक यह स्पष्ट रूप से सामान्य स्पष्टता के मामले में सबसे अच्छा विकल्प है, तो मैं इसे किसी भी तरह से उपयोग करने से बचने की कोशिश करता हूं, लेकिन कभी-कभी यह हो सकता है।

आप इसे केवल yield return और yield break के लिए प्रासंगिक कीवर्ड के रूप में उपयोग कर सकते हैं, जो केवल एक इटरेटर ब्लॉक में मान्य है। (वे को में एक इटरेटर में बदलते हैं।)

संपादित करें: अपने "इसे अनुमति दी जानी चाहिए" प्रश्न का उत्तर देने के लिए ... हाँ, यह चाहिए। अन्यथा सी # 2 जारी होने पर सभी मौजूदा सी # 1 कोड जो yield पहचानकर्ता के रूप में उपयोग किए गए थे, अमान्य हो गए होंगे। इसे का उपयोग के साथ किया जाना चाहिए, और सी # टीम ने यह सुनिश्चित किया है कि यह वास्तव में अस्पष्ट नहीं है, लेकिन यह वैध होने के लिए समझ में आता है।

वही कई अन्य प्रासंगिक खोजशब्दों के लिए जाता है - "से", "चयन करें", "कहां" आदि। क्या आप उनको पहचानने वाले लोगों से रोकना चाहते हैं?

+0

हां, यह बिल्कुल मेरी बात है – GETah

+1

@GETah: ठीक है, यह वास्तव में आपके द्वारा दिए गए संदर्भ में * कीवर्ड * नहीं है ... –

+0

जॉन, बस मेरी समझ का परीक्षण कर रहा है ... क्या उपज ' [my answer] (http://stackoverflow.com/q/8273864/593627) में मेरे 'GetNotVeryRandomNumbers' जैसी विधि) एक पुनरावर्तक ब्लॉक में नहीं है? (मैंने सोचा कि 'उपज' एक बनाता है, लेकिन एक के भीतर मौजूद नहीं है)। ऐसा लगता है कि आपका अंतिम बयान है। –

5

yieldप्रासंगिक कीवर्ड है।
जब yield return या yield break में उपयोग किया जाता है, तो यह एक कीवर्ड होता है और एक इटरेटर बनाता है।
जब कहीं और इस्तेमाल किया जाता है, तो यह एक सामान्य पहचानकर्ता होता है।

yieldmore than ordinary collections के लिए बेहद उपयोगी हो सकता है; इसका उपयोग आदिम कोरआउट को लागू करने के लिए भी किया जा सकता है।

+0

+1 मैं गलत हो सकता हूं, लेकिन मुझे लगता है कि यह प्रश्न के बिंदु को याद करता है। सवाल यह नहीं है कि "इटरेटर ब्लॉक उपयोगी हैं?" - लेकिन इसके बजाय: जब *** *** के बाहर एक इटरेटर ब्लॉक का उपयोग किया जाता है, तो "उपज" उपयोगी होती है? – phoog

11

जो कह रहा है वह यह है कि यदि आप किसी विधि में yield का उपयोग करते हैं तो विधि एक इटरेटर ब्लॉक बन जाती है।

इसके अलावा, yieldcontextual keyword है, इसे आसानी से कहीं और इस्तेमाल किया जा सकता है, जहां पूर्ण कीवर्ड (उदा। परिवर्तनीय नाम) नहीं हो सकते हैं।

void AnotherMethod() 
{ 
    foreach(var NotRandomNumber in GetNotVeryRandomNumbers()) 
    { 
     Console.WriteLine("This is not random! {0}", NotRandomNumber); 
    } 
} 

IEnumerable<int> GetNotVeryRandomNumbers() 
{ 
    yield return 1; 
    yield return 53; 
    yield return 79; 
    yield return 1; 
    yield return 789; 
} 

// Perhaps more useful function below: (untested but you get the idea) 
IEnumerable<Node> DepthFirstIteration(Node) 
{ 
    foreach(var Child in Node.Children) 
    { 
     foreach(var FurtherChildren in DepthFirstIteration(Child)) 
     { 
      yield return FurtherChildren; 
     } 
    } 
    yield return Node; 
} 

यह भी देखें: इस उत्तर है, जो एक के बाद एक उपज का उपयोग कर पता चलता है। Clever Uses of Iterator Blocks

+0

के लिंक के लिए –

+0

'GetNotVeryRandomNumbers' विधि में यह एक पुनरावर्तक ब्लॉक में नहीं है (यह एक बनाता है), या क्या मैं इटरेटर ब्लॉक को गलत समझ रहा हूं? –

+0

संपादन के साथ, यह स्पष्ट है कि मैं निश्चित रूप से प्रश्न के बिंदु को याद करता हूं! (ओओएस) –

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