2009-04-20 7 views
6

वहाँ एक बुनियादी नियम यह जब new कीवर्ड और जब नहीं जब वस्तुओं की घोषणा करने के लिए उपयोग करने के लिए पालन करने के लिए है?करने के लिए 'नई' है या नहीं करने के लिए "नया"

List<MyCustomClass> listCustClass = GetList(); 

या

List<MyCustomClass> listCustClass = new List<MyCustomClass>(); 
listCustClass = GetList(); 
+0

क्या आप वास्तव में पूछ रहे हैं कि आपको कारखानों को लिखना चाहिए या नहीं? – annakata

+6

नहीं, मुझे लगता है कि वह समझ में नहीं आता है कि "नया" का अर्थ है एक कन्स्ट्रक्टर कॉल और एक नई वस्तु का निर्माण। अन्यथा वह एक नई वस्तु बनाने और फिर इसे फेंकने से बेहतर जानता होगा। हो सकता है कि वह वीबीएनईटी से आ रहा है, जहां "नया" कीवर्ड घोषणा वाक्यविन्यास का हिस्सा हो सकता है, इसलिए वह सोचता है कि यह सी # में है। –

+0

मुझे इस पर सी # और .NET टैग के बारे में निश्चित नहीं है क्योंकि यह एक सामान्य सामान्य ओओपी प्रश्न है। – Welbog

उत्तर

8

आपके परिदृश्य में ऐसा लगता है कि ऑब्जेक्ट का वास्तविक निर्माण आपके GetList() विधि के अंदर किया जा रहा है। तो आपका पहला नमूना सही उपयोग होगा।

बनाया गया, तो आपके List<MyCustomClass> ढेर में संग्रहीत है, और आपके listCustClass बस उस नई वस्तु का संदर्भ है। जब आप listCustClass को GetList() पर सेट करते हैं तो listCustClass के संदर्भ सूचक को त्याग दिया जाता है और संदर्भ सूचक के साथ प्रतिस्थापित किया जाता है जो GetList() रिटर्न (शून्य हो सकता है)। जब ऐसा होता है तो आपका मूल List<MyCustomClass> अभी भी ढेर में है, लेकिन कोई ऑब्जेक्ट्स इसके लिए इंगित नहीं करता है, इसलिए कचरा कलेक्टर के आसपास आने तक इसे केवल बर्बाद कर रहा है और इसे साफ़ कर देता है।

हर बार जब आप एक नई वस्तु बनाते हैं तो इसे समेटने के लिए, दूसरे उदाहरण की तरह इसे छोड़ दें, आप अनिवार्य रूप से बेकार जानकारी के साथ ढेर भरकर स्मृति बर्बाद कर रहे हैं।

18

केवल अपना पहला उदाहरण के बाद से दूसरे मामले में आप तुरंत विधि से लौटे एक के साथ बनाई गई सूची से बदल रहे हैं कि इस मामले में किसी भी समझ में आता है। एक नई खाली सूची में एक सूची शुरू करना उन मामलों में समझ में आता है जहां आप उस सूची में जोड़ रहे हैं या जब यह संभव है कि जिस विधि को आप सूची को पॉप्युलेट करने के लिए बुला रहे हैं, तो किसी भी तरह से एक शून्य मान हो सकता है जब आप अन्यथा खाली सूची की अपेक्षा करेंगे ।

उदाहरण है जहाँ मैं एक नया, रिक्त सूची में प्रारंभ का उपयोग हो सकता है।

List<MyCustomClass> listCustClass = new List<MyCustomClass>(); 
listCustClass.AddRange(GetList()); 

या

List<MyCustomClass> listCustClass = new List<MyCustomClass>(); 
try 
{ 
    listCustClass = GetList(); 
} 
catch (SqlException) 
{ 
} 
return listCustClass; 
43

अपने दूसरे मामले में आप पहली पंक्ति पर एक नई वस्तु बना रहे हैं सिर्फ दूसरी पंक्ति पर इसे फेंक करने के लिए। पूरी तरह से अनावश्यक।

+1

मुझे विश्वास नहीं है कि यह मेरा सबसे ज्यादा उत्तर देने वाला उत्तर है। – erikkallen

2

यदि आप जो भी हासिल कर रहे हैं, उसके अर्थ, इनलाइनों के अर्थ और स्पष्टता को खोए बिना इसे रेखांकित कर सकते हैं।

संपादित करें: और, जैसा कि मैं नियमित रूप से इनलाइन करता हूं, मैंने अनाथ ऑब्जेक्ट संदर्भ के बारे में भी नहीं सोचा था। रवींद्र। =)

+0

यह जानना अच्छा लगेगा कि * क्या * डाउनवोट था। =) –

+0

यह वोर डैनियल का जवाब था - बस गलत प्रविष्टि मारा ...: डी –

+0

अहहा। मेरे सहयोगी ने भी पूरे दिन अपने माउस के साथ लापता रखा। सोमवार होना चाहिए। =) –

3

आप ऑब्जेक्ट का एक नया उदाहरण बनाने के लिए new कीवर्ड का उपयोग करते हैं। यह आपके प्रश्न से स्पष्ट नहीं है कि GetList विधि क्या करती है, लेकिन संभवतः यह या तो एक नई सूची बना रही है (इस प्रकार new कीवर्ड कहीं और स्थानांतरित कर रही है) या कोईnew का उपयोग करके एक बिंदु पर बनाया गया)।

+0

गेटलिस्ट को सूची बनाने के लिए नया उपयोग करना चाहिए ताकि वह इसे कॉलर पर वापस कर सके। सही? गेटलिस्ट को लागू करने का कोई और तरीका है? –

+0

मुद्दा यह है कि कोई सूची बना रहा है, भले ही यह GetList है या GetList कॉल की कुछ विधि है। –

0

की "मैं नए प्रयोग करना चाहिए जब मैं घोषणा" संदर्भ में इसके बारे में मत सोचो।

आप नए का उपयोग करके ऐसी बताए जाते हैं (जो एक घोषणा का हिस्सा हो सकता है)।

पहला उदाहरण सही है, तो दूसरे क्रम संसाधनों का एक अनावश्यक बर्बादी है।

1

अंगूठे का कोई नियम नहीं है, लेकिन आम भावना है कि आप समय के सबसे अधिक आवेदन कर सकते हैं नहीं है।

जब इसे बनाया जा रहा है तो किसी ऑब्जेक्ट को तत्काल करने की आवश्यकता है। आपका GetList() फ़ंक्शन स्पष्ट रूप से एक (बनाया गया) IList देता है इसलिए दूसरा कोड स्निपेट काफी अनावश्यक है (आप एक IList को तत्काल बनाते हैं और इसे प्रभावी रूप से अगली पंक्ति पर छोड़ देते हैं)।

पहला स्निपेट पूरी तरह उपयुक्त है, हालांकि।

0

सी # में, कक्षाओं के सभी उदाहरणों को new कीवर्ड के साथ बनाया जाना है। यदि आप अपने वर्तमान संदर्भ में new का उपयोग नहीं कर रहे हैं, तो आपके पास या तो एक शून्य संदर्भ है, या आप उस फ़ंक्शन को कॉल कर रहे हैं जो कक्षा को इंस्टाल करने के लिए new का उपयोग करता है।

इस मामले में, ऐसा लगता है कि GetList() एक नई सूची बनाने के लिए new का उपयोग करता है।

3

नया कीवर्ड मूल रूप से ढेर पर स्थान आवंटित करने के लिए उपयोग किया जाता है। यदि आप एक मान प्रकार (structs, आदि ...) बना रहे हैं तो आपको नए कीवर्ड का उपयोग करने की आवश्यकता नहीं है। हालांकि, उपयोग किए जाने से पहले संदर्भ चर को नए किया जाना चाहिए।

आपके उपर्युक्त उदाहरण में, ऐसा लगता है कि GetList() एक ऐसे संदर्भ को वापस कर रहा है जो प्रकार की सूची है जो फ़ंक्शन के भीतर कहीं (new'd) बनाया गया होता। इसलिए इस परिदृश्य में, नया 'व्यर्थ है।

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