2012-12-18 9 views
12

मैं उत्सुक अगर कोई किसी भी नियम के-अंगूठे या जब यह भावना एक आस्थगित IEnumerable<T> वापस जाने के लिए या से लौटने से पहले उस पर ToArray() कॉल करने के लिए बनाया है उनके सर्वोत्तम प्रथाओं है कर रहा हूँ एक समारोह।जब यह बुरा प्रपत्र वापस जाने के लिए है एक आस्थगित IEnumerable <T>

उदाहरण के लिए, एक एपीआई के उपभोक्ता के रूप में मुझे लगता है कि IEnumerable<Widget> GetWidgets() जैसे HttpException को फेंकने के लिए मैं इसे पसंद करता हूं और जब मैं परिणामों की गणना कर रहा हूं तो इसे फेंक नहीं देता है।

public IEnumerable<Widget> GetWidgets(IEnumarable<int> widgetIds) { 
    return widgetIds.Select(id => GetWidgetFromWidgetWebService(id)); 
} 
+0

मैं एक बार ऐसा नहीं सोच सकता कि मैं कभी भी एक स्थगित आईनेमरेबल और बहुत कुछ वापस लौटना चाहता हूं जब मैंने इसे दुर्घटनाग्रस्त कर दिया और कोड के सभी प्रकार तोड़ दिए। – BenCr

+0

लेकिन, किसी भी तरह से फेंक दिया अपवाद नहीं होना चाहिए? कम से कम उस मामले में वे वही काम करेंगे। – rae1

+1

@ rae1n हां, अपवाद किसी भी तरह से फेंक दिया जाएगा, लेकिन कल्पना करें कि एक परिभाषित 'आईनेमेरेबल ' एक परत या दो के माध्यम से पारित किया जा रहा है, केवल कॉल-साइट पर एक अपवाद डाला गया है जहां से मूल संग्रह वापस किया गया था। – joshperry

उत्तर

6

मैं हमेशा जब वहाँ की यह आस्थगित किया जा रहा महत्वपूर्ण दुष्प्रभाव नहीं हैं एक आस्थगित IEnumerable<T> लौटने पसंद करते हैं। यदि संख्यात्मक एक आंतरिक संग्रह पर आधारित है जो संभवतः बदल सकता है, उदाहरण के लिए, मैं पहले इसका मूल्यांकन करना पसंद करूंगा।

हालांकि, अगर गणना करने योग्य गणना की जा रही है, तो मैं आमतौर पर इसे रोक दूंगा।

+0

कॉलर हमेशा 'ToList() 'को कॉल कर सकता है और वांछित होने पर तुरंत मूल्यांकन कर सकता है। मुझे लगता है कि कॉलर को यह विकल्प बनाने देना सबसे अच्छा है, जब तक कि आपने कहा, ऐसा कोई अच्छा कारण नहीं है। –

+0

@ जोनबी यह मेरा विचार है - जब संभव हो तो मैं अनुकूलन को अनुमति देना पसंद करता हूं। –

+2

एक अपवाद तब होगा जब आप 'IENumerable' को किसी संदर्भ में पास कर रहे हों, जहां यह अनुमान लगाने के लिए _possible_ नहीं होगा। उदाहरण के लिए, जब 'ईन्यूमेरेबल ' ईएफ संदर्भ का उपयोग करके उत्पन्न किया गया था जो गणना के समय से निपटान किया जाएगा। इसके अलावा, मैं मानता हूं कि इसे स्थगित करने से संरचना के लिए बेहतर है। –

1

यदि आपके गणित को व्यावहारिक रूप से फेंकने की उम्मीद की जा सकती है, तो बेसब्री से मूल्यांकन करें (यदि संभव हो तो)। आप नहीं चाहते कि त्रुटि किसी दूरस्थ स्थान पर हो जो त्रुटि के कारण से संबंधित नहीं है। आप उस त्रुटि को चाहते हैं जहां यह हुआ था।

आखिरकार, विधि का नाम पूरा नहीं हुआ, जिसका नाम विज्ञापन करता है, इसलिए इसे फेंकना चाहिए।

मैं आमतौर पर इस तरह के मामलों में वापसी प्रकार को IList<T> में बदलता हूं ताकि यह दस्तावेज हो सके कि यह उत्सुकता से निष्पादित हो।

+0

मुझे वास्तव में मेरे कोड के साथ अभिव्यक्ति करने की कोशिश करना पसंद है, अगर आप चाहते हैं तो इरादा बताएं। उन मामलों में 'IList ' लौटने के साथ मेरे पास एकमात्र समस्या यह है कि यह कहता है "अरे, यह एक परिवर्तनीय संग्रह है"। मुझे यकीन नहीं है कि एक बेहतर विकल्प क्या है; शायद 'टी []', शायद 'IReadOnlyList '? – joshperry

+0

@joshperry मैं संग्रहों को संशोधित नहीं करता हूं इसलिए मुझे यह समस्या नहीं है। मैं आम तौर पर एक नया बना देता हूं जो सी # 3.0 के बाद से आसान है। – usr

+0

कहने के लिए कुछ भी नहीं है कि 'IList ' उत्सुकता से निष्पादित किया गया है। यह काफी संभव है, और अक्सर वांछनीय है, 'IList ' है जो केवल आवश्यक है कि यह आवश्यक हो। –

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