मुझे एहसास है कि यह एक पुराना प्रश्न है (पूर्व जॉन स्कीट?) लेकिन मैं हाल ही में इस सवाल पर विचार कर रहा हूं। दुर्भाग्य से यहां वर्तमान उत्तरों (मेरी राय में) उपज कथन का सबसे स्पष्ट लाभ का उल्लेख नहीं करते हैं।
उपज कथन का सबसे बड़ा लाभ यह है कि यह आपको मानक सूची कहने के बाद बहुत अधिक कुशल स्मृति उपयोग के साथ बहुत बड़ी सूचियों पर फिर से शुरू करने की अनुमति देता है।
उदाहरण के लिए, मान लीजिए कि आपके पास डेटाबेस क्वेरी है जो 1 मिलियन पंक्तियां लौटाती है। आप DataReader का उपयोग करके सभी पंक्तियां पुनर्प्राप्त कर सकते हैं और उन्हें एक सूची में स्टोर कर सकते हैं, इसलिए स्मृति की list_size * row_size बाइट्स की आवश्यकता होती है।
या आप एक इटरेटर बनाने के लिए उपज कथन का उपयोग कर सकते हैं और एक समय में स्मृति में केवल एक पंक्ति को स्टोर कर सकते हैं। असल में यह आपको डेटा के बड़े सेटों पर "स्ट्रीमिंग" क्षमता प्रदान करने की क्षमता देता है।
इसके अलावा, इटरेटर का उपयोग करने वाले कोड में, आप एक साधारण फोरैच लूप का उपयोग करते हैं और आवश्यकतानुसार लूप से बाहर निकलने का निर्णय ले सकते हैं।यदि आप जल्दी तोड़ते हैं, तो आपने डेटा के पूरे सेट को पुनर्प्राप्त करने के लिए मजबूर नहीं किया है जब आपको केवल पहली पंक्तियों (उदाहरण के लिए) की आवश्यकता होती है।
के बारे में
:
Ideally some problem that cannot be solved some other way
उपज बयान आप कुछ भी आप अपने स्वयं के कस्टम इटरेटर कार्यान्वयन का उपयोग नहीं कर सका नहीं देता है, लेकिन यह आप अक्सर जटिल कोड की जरूरत लिखने के लिए की आवश्यकता होगी, बचत होती है। बहुत कम समस्याएं हैं (यदि कोई है) जो एक से अधिक तरीकों से हल नहीं हो सकती हैं।
Yield keyword value added?
Is yield useful outside of LINQ?