अपने कार्यक्रमों की योजना बनाते समय, मैं अक्सर इस तरह की सोच की एक श्रृंखला के साथ शुरुआत करता हूं:
एक फुटबॉल टीम सिर्फ फुटबॉल खिलाड़ियों की एक सूची है। इसलिए, मुझे इसका प्रतिनिधित्व करना चाहिए:
var football_team = new List<FootballPlayer>();
इस सूची का क्रम उस क्रम का प्रतिनिधित्व करता है जिसमें खिलाड़ी रोस्टर में सूचीबद्ध होते हैं।
लेकिन मुझे बाद में महसूस हुआ कि टीमों के पास खिलाड़ियों की सूची के अलावा अन्य गुण भी हैं, जिन्हें दर्ज किया जाना चाहिए। उदाहरण के लिए, इस सीजन में रनिंग टोटल, मौजूदा बजट, एकसमान रंग, string
टीम के नाम का प्रतिनिधित्व आदि।
तो मुझे लगता है:
ठीक है, एक फुटबॉल टीम खिलाड़ियों की एक सूची की तरह है, लेकिन इसके अलावा, इसमें एक नाम (ए
string
) और एक रनिंग कुल स्कोर (एint
) है। .NET फ़ुटबॉल टीमों के भंडारण के लिए एक वर्ग प्रदान नहीं करता है, इसलिए मैं अपनी कक्षा बनाऊंगा। सबसे समान और प्रासंगिक मौजूदा संरचना हैList<FootballPlayer>
, इसलिए मुझे इससे विरासत मिलेगी:class FootballTeam : List<FootballPlayer> { public string TeamName; public int RunningTotal }
लेकिन यह पता चलता है कि एक गाइडलाइन कहती है कि आपको विरासत में नहीं लेना चाहिएList<T>
। मैं इस गाइडलाइन से दो तरह से भ्रमित हूं।
क्यों नहीं?
जाहिरा तौर List
पर किसी भी तरह प्रदर्शन के लिए अनुकूलित है । ऐसा कैसे? यदि मैं विस्तार करता हूं तो मुझे कौन सी प्रदर्शन समस्याएं होंगी List
? क्या वास्तव में टूट जाएगा?
एक अन्य कारण जो मैंने देखा है वह List
यह है कि Microsoft द्वारा प्रदान किया गया है, और मुझे इस पर कोई नियंत्रण नहीं है, इसलिए मैं "सार्वजनिक एपीआई" को उजागर करने के बाद इसे बाद में नहीं बदल सकता । लेकिन मैं इसे समझने के लिए संघर्ष करता हूं। सार्वजनिक एपीआई क्या है और मुझे इसकी देखभाल क्यों करनी चाहिए? यदि मेरी वर्तमान परियोजना में यह सार्वजनिक एपीआई नहीं है, तो क्या मैं इस दिशानिर्देश को सुरक्षित रूप से अनदेखा कर सकता हूं? अगर मुझे विरासत में मिली List
और यह पता चला कि मुझे सार्वजनिक एपीआई की आवश्यकता है, तो मुझे क्या कठिनाइयाँ होंगी?
इससे भी फर्क क्यों पड़ता है? एक सूची एक सूची है। क्या संभवतः बदल सकता है? मैं संभवतः क्या बदलना चाहता हूं?
और अंत में, अगर Microsoft नहीं चाहता था कि मुझे विरासत से मिले List
, तो उन्होंने कक्षा क्यों नहीं बनाई sealed
?
मुझे और क्या उपयोग करना चाहिए?
जाहिरा तौर पर, कस्टम संग्रह के लिए, Microsoft ने एक Collection
वर्ग प्रदान किया है जिसे इसके बजाय बढ़ाया जाना चाहिए List
। लेकिन इस वर्ग के बहुत नंगे है, और कई उपयोगी चीजें, नहीं है जैसेAddRange
उदाहरण के लिए,। jvitor83 का जवाब उस विशेष पद्धति के लिए एक प्रदर्शन तर्क प्रदान करता है, लेकिन कैसे एक धीमी गति AddRange
से बेहतर नहीं है AddRange
?
Collection
इनहेरिट करना जिस तरह से विरासत में मिला है उससे अधिक काम है List
, और मुझे कोई लाभ नहीं दिखता है। निश्चित रूप से Microsoft मुझे बिना किसी कारण के अतिरिक्त काम करने के लिए नहीं कहेगा, इसलिए मैं यह महसूस करने में मदद नहीं कर सकता कि मैं किसी तरह से कुछ गलत समझ रहा हूं, और विरासत में Collection
लेना वास्तव में मेरी समस्या का सही समाधान नहीं है।
मैंने सुझाव दिए हैं जैसे कि लागू करना IList
। बस नहीं। यह बॉयलरप्लेट कोड की दर्जनों लाइनें हैं जो मुझे कुछ भी नहीं देती हैं।
अंत में, कुछ कुछ में लपेटने का सुझाव देते List
हैं:
class FootballTeam
{
public List<FootballPlayer> Players;
}
इसके साथ दो मुश्किलें हैं:
यह मेरा कोड अनावश्यक रूप से क्रिया करता है। मुझे अब
my_team.Players.Count
बस के बजाय कॉल करना होगाmy_team.Count
। शुक्र है, C # के साथ मैं अनुक्रमित को पारदर्शी बनाने के लिए इंडेक्सर्स को परिभाषित कर सकता हूं, और आंतरिक के सभी तरीकों को आगे बढ़ा सकता हूंList
... लेकिन यह बहुत कोड है! मुझे उस काम के लिए क्या मिलेगा?यह सिर्फ सादा मतलब नहीं है। एक फुटबॉल टीम के पास खिलाड़ियों की सूची नहीं है। यह है खिलाड़ियों की सूची। आप यह नहीं कहते "जॉन मैकफुटबॉलर SomeTeam के खिलाड़ियों में शामिल हो गया है"। आप कहते हैं "जॉन SomeTeam में शामिल हो गए हैं"। आप "स्ट्रिंग के पात्रों" के लिए एक पत्र नहीं जोड़ते हैं, आप एक स्ट्रिंग में एक पत्र जोड़ते हैं। आप किसी पुस्तकालय की पुस्तकों में पुस्तक नहीं जोड़ते हैं, आप पुस्तकालय में पुस्तक जोड़ते हैं।
मुझे पता है कि "हुड के नीचे" क्या होता है, इसे "एक्स की वाई की आंतरिक सूची में जोड़ना" कहा जा सकता है, लेकिन यह दुनिया के बारे में सोचने का एक बहुत ही सहज ज्ञान युक्त तरीका है।
मेरा प्रश्न (संक्षेप में)
एक डेटा संरचना है, जो, "तार्किक" ( "मनुष्य के मन के लिए" कहने के लिए है कि,) सिर्फ एक है का प्रतिनिधित्व करने का सही तरीका क्या है सी # list
के things
कुछ घंटियां और सीटियां के साथ?
क्या List<T>
हमेशा से अस्वीकार्य है? यह कब स्वीकार्य है? क्यों नहीं? एक प्रोग्रामर को क्या विचार करना चाहिए, यह तय करते समय कि क्या विरासत में मिला है List<T>
या नहीं?
string
सब कुछ एक ऐसा करना पड़ता है object
क्या कर सकते हैं और अधिक ।