C # विधि नामकरण परंपराएं: ToSomething बनाम AsSomething


82

जैसा कि मैं अपने व्यापार तर्क वस्तुओं के लिए कुछ विस्तार विधियां लिख रहा था, मैं रूपांतरण विधियों का नाम बदलने के सवाल पर आया था। someObject.ToAnotherObject()व्यापक रूप से इस्तेमाल के साथ ठीक हो जाएगा object.ToString()

हालाँकि, LINQ, उदाहरण के लिए, दोनों वेरिएंट को मिलाता है और मैं उनके बीच अंतर नहीं खोज सकता। ToDictionary(), ToList(), AsParallel(), AsQueryable(), ...

इन दो नामकरण सम्मेलनों के बीच क्या अंतर हैं और मुझे यह तय करने के लिए पता होना चाहिए कि क्या मुझे अपनी कक्षाओं के लिए उपयोग करना है?

जवाबों:


91

ToDictionaryऔर ToListइसके साथ उपसर्ग हैं Toक्योंकि वे मूल संग्रह या इसके गुणों की संरचनात्मक पहचान को जरूरी नहीं रखते हैं।

  • एक List<T>में बदलना एक Dictionary<K, V>पूरी नई संरचना के साथ एक संग्रह बनाता है।
  • एक HashSet<T>में रूपांतरण List<T>सेट की विशिष्टता संपत्ति को निकालता है।

Asइन चीजों में से किसी के साथ भी उपसर्ग किए गए तरीके - वे मूल संग्रह का एक वैकल्पिक दृश्य प्रदान करते हैं । उन्होंने इसे समृद्ध किया।


41
इसलिए, एक सेब पर मुझे कॉल किया जा सकता है .AsCleanApple()क्योंकि मुझे केवल इसे धोने की ज़रूरत है, और .ToFruitSalad()क्योंकि मेरा चाकू ऐप्पल की संरचना को बदल देगा
Physikbuddha

3
@Physikbuddha मूल रूप से, हाँ।
MKII

38
@Physikbuddha मुझे ऐसा लगता है जैसे सेब के बारे में कुछ बदलAsCleanApple जाएगा । एक बेहतर सादृश्य हो सकता हैAsFruit
dcastro

4
.AsCleanAppleSource()कुछ ऐसा होगा जो सेब का एक स्रोत था जो कि स्वच्छ सेब का एक स्रोत था; यदि आवश्यक हो तो एक धोने का चरण जोड़ना लेकिन शायद कुछ भी नहीं करने से सेब पहले से ही साफ होने के लिए जाना जाता था। .ToPunnet()उस स्रोत तक पहुँच सकते हैं और आपको सेब का एक दंड देंगे।
जॉन हैना

2
यह कड़ाई से सच नहीं है, लेकिन सामान्य तौर पर आप "AsXXX ()" को एक कास्ट के रूप में और "टॉक्सएक्सएक्स ()" को रूपांतरण के रूप में सोच सकते हैं।
नैटविरिन

26

Linq में, ToXXXसभी तरीके क्वेरी को निष्पादित करते हैं और परिणामों से एक नई वस्तु बनाते हैं, जबकि AsXXXविधियाँ एक नई क्वेरी का उत्पादन करती हैं जो किसी तरह से अलग होती है। यह एक ही ऑब्जेक्ट हो सकता है लेकिन एक अलग इंटरफ़ेस ( AsEnumerable()यह करता है) के माध्यम से एक्सेस किया जा सकता है या यह एक नई ऑब्जेक्ट हो सकती है जो कार्यक्षमता को बदल देती है (अन्य विधियां ऐसा करती हैं, हालांकि कुछ चेक यह देखने के लिए कि क्या वे दिए गए ऑब्जेक्ट को वापस कर सकते हैं, जैसे AsQueryable()कि। sourceयदि यह IQueryable<T>पहले से ही लागू है , तो वापस लौटें या एक नया EnumerableQuery<TElement>अन्यथा बनाएं )।


that alters how the functionality- howअनावश्यक है या बयान का अगला हिस्सा होना चाहिए?
कपोल

@ कपोल नं, एक ही समय में कंपोजिंग और टाइपिंग के कारण होने वाला एक टाइपो।
जॉन हन्ना

मुझे लगता है कि यह सही उत्तर है, अर्थात मूल उदाहरण का सक्रिय बनाम स्थिर प्रक्षेपण। ToXXX()डेटा को मूल के साथ कोई संबंध नहीं रखता है। AsXXX()मूल के लिए एक सक्रिय संबंध बनाए रखता है (कम से कम Enumerable / Queryable उदाहरणों में हम चर्चा कर रहे हैं)।
टिम मेडोरा

+1 के लिए ToXXX execute the queryऔर AsXXX produce a new query। क्या मैं LINQ पर पढ़ा है, और MSXX ToXXX के लिए पुष्टि करने के लिए लगता है से सही लगता है , लेकिन मैं सोच रहा था कि क्या किसी के पास सभी AsXXX तरीकों के निष्पादन के लिए कोई स्रोत है या नहीं ?
ब्रिचिन

1
@brichins "सभी" कहने का एक सार्थक तरीका भी है कि हम में से कोई भी एक नए प्रदाता के साथ आ सकता है जो कि लीनिक के AsXXXलिए अंतर्निहित उन लोगों के ऊपर एक नया AsParallelजोड़ देता है (जैसे कि PLinq द्वारा जोड़ा गया है, जो AsNoTrackingएंटिटी फ्रेमवर्क द्वारा प्रदान किया गया है) और इसी तरह)। निश्चित रूप से, linq का मूल वह है जो परिभाषित किया गया है Queryableऔर Enumerable, और उन दो वर्गों दोनों उस सम्मेलन का पालन करते हैं। अधिकांश परिवर्धन इस सीमा तक करते हैं कि "सभी" शायद सही होगा, लेकिन यह हमेशा सही होने की गारंटी के लिए खुला है (हालांकि मैं किसी भी डिजाइन दोष को समझूंगा)।
जॉन हैना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.