2008-11-22 15 views
17

मैं .NET 1.1 से .NET 2.0 तक एक एप्लिकेशन माइग्रेट कर रहा हूं। क्या मुझे कलेक्शनबेस के सभी उपयोगों को हटा देना चाहिए? यदि हां, तो माइग्रेशन के लिए सबसे अच्छी रणनीति क्या है?कलेक्शनबेस बनाम जेनेरिक

उत्तर

22

हां, देखने के लिए सर्वोत्तम कक्षाएं सिस्टम में हैं। चयन। जेनेरिक।
मैं आमतौर पर सूची का उपयोग करता हूं।

आप उपयोग कर सकते हैं या तो दो दृष्टिकोण हैं:

एक

public class MyClass 
{ 
    public List<MyItem> Items; 
} 

बी

public class MyItemCollection : List<MyItem> 
{ 
} 

public class MyClass 
{ 
    public MyItemCollection Items; 
} 

दो दृष्टिकोण केवल अलग बहुत थोड़ा और आप केवल उपयोग करने की आवश्यकता विधि (बी) यदि आप सूची की कार्यक्षमता को विस्तारित करने की योजना बनाते हैं।
http://msdn.microsoft.com/en-us/library/6sh2ey19(VS.80).aspx

साथ वर्गों है कि आप पहले से ही क्रियान्वित किया है, तो आप कार्य करता है जो IList इंटरफ़ेस में निर्दिष्ट कर रहे हैं के सभी को हटा सकते हैं के संबंध:

यहाँ अधिक जानकारी के साथ एक लिंक है। जैसे

public int Add(InstrumentTradeDataRow instTrade) { return List.Add(instTrade); } 

इसे हटाया जा सकता है क्योंकि सूची पहले से ही आपके लिए एक प्रकार का सुरक्षित कार्य लागू करती है।
http://msdn.microsoft.com/en-us/library/3wcytfd1(VS.80).aspx

+0

क्या आप मुझे एक उदाहरण दे सकते हैं। । – leora

+1

हो गया। आप और कुछ और देखना चाहते हैं? –

+0

क्या मैं इस तरह मौजूदा कोड के साथ क्या करते हैं: \t सार्वजनिक पूर्णांक जोड़ें (InstrumentTradeDataRow instTrade) \t \t { \t \t \t वापसी List.Add (instTrade); \t \t} – leora

1

मैं पसंद मार्क Ingrams ए) दृष्टिकोण, संभवतः एक आधार वर्ग आप अपने आप को लिखने के साथ:

अधिक जानकारी के लिए इस लिंक पर देखें।

जेनेरिकों के साथ माइग्रेट करने के साथ एक और मुद्दा है; कनवर्टिंग में एक निश्चित वायरल प्रभाव होने की प्रवृत्ति है। आप सभी तरह से पहले होने से पहले इसे रोकना असंभव हो सकता है। अगर आपको लगता है कि आप कुछ जेनेरिक कुछ घंटों खर्च करने जा रहे थे, तो आप अक्सर अपने सभी जेनेरिकों को करने में कई दिन बिताएंगे।

आप/अपने नए वर्गों

public static implicit operator MyClass(List m) 
{ 
    // code to convert from m to MyClass 
} 

public static explicit operator List(MyClass m) 
{ 
    // code to convert from MyClass list 
} 

सूची

से/ऑपरेटर भार के दे रही है ये वास्तव में सिर्फ stopgaps हैं द्वारा इस से बचना चाहिए कर सकते हैं। आप किसी भी चरण में इन पर "उपयोग ढूंढें" का उपयोग यह निर्धारित करने के लिए कर सकते हैं कि कौन से स्थान पूरी तरह से परिवर्तित नहीं हुए हैं। जब सभी उपयोग हटा दिए जाते हैं, तो आप कास्ट को हटा सकते हैं।

मैं आमतौर पर माई क्लास से सूची को स्पष्ट करने के लिए संदर्भित करता हूं (इस तरह से आप जाना नहीं चाहते हैं) और अन्य अंतर्निहित।

सबसे अच्छा तरीका आमतौर पर प्रस्तुति परत के करीब, प्रस्तुति परत के करीब, और नीचे काम करने के लिए आपकी परतों के शीर्ष पर शुरू होना होगा। (यह आपके विचार के विपरीत है। यदि आप माई क्लास से सूची को अंतर्निहित सूची में डालते हैं तो इससे कोई फर्क नहीं पड़ता कि आप किस अंत में शुरू करते हैं)

16

आम तौर पर, List<T> जो आप सामान्य रूप से चाहते हैं, वह करता है। यदि आप व्यवहार को कस्टमाइज़ करना चाहते हैं, तो आपको Collection<T> से उत्तराधिकारी होना चाहिए - इसमें virtual विधियां हैं ताकि आप जोड़ने/निकालने/अपडेट करने के दौरान व्यवहार को ट्विक कर सकें। आप List<T> के साथ ऐसा नहीं कर सकते हैं क्योंकि कोई (uesful) virtual विधियां नहीं हैं।

+0

दुर्भाग्यवश 'संग्रह .एड्यू' वर्चुअल नहीं है हालांकि यह निश्चित रूप से होना चाहिए। – abatishchev

+4

@abatishchev - नहीं, लेकिन 'InsertItem' * है * (जो 'SetItem' (जो पुनः-असाइनमेंट को संभालता है) है, –

+0

हाँ, आप सही हैं, मैंने थोड़ा तेज़ किया है, धन्यवाद! – abatishchev

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