2013-03-01 8 views
6

यह इतना महत्वपूर्ण नहीं है लेकिन मैं यह समझने की कोशिश कर रहा हूं कि यह मुझे क्या बता रहा है और क्या यह एक वैध चेतावनी है? क्या कोई इस त्रुटि को मेरे लिए सरल शब्दों में समझा सकता है? 'CongressDBEntities':सीए 1001 विजुअल स्टूडियो 2012 कोड विश्लेषण चेतावनी। इसका क्या मतलब है?

CA1001 प्रकार है कि डिस्पोजेबल क्षेत्रों के मालिक हैं डिस्पोजेबल

'MemVoteManager' पर IDisposable को लागू करें, क्योंकि यह निम्नलिखित IDisposable प्रकार के सदस्यों बनाता है होना चाहिए। यदि 'MemVoteManager' पहले भेज दिया गया है, तो इस प्रकार के लिए IDISposable लागू करने वाले नए सदस्यों को जोड़ने से मौजूदा उपभोक्ताओं में ब्रेकिंग परिवर्तन माना जाता है।

public class MemVoteManager : AbstractDataManager, IMemVoteManager 
{ 
    private CongressDBEntities context = new CongressDBEntities(); 

    public int AddMemVote(tMemVoteScore mvs) 
    { 
     //Insert Model 
     context.tMemVoteScores.Add(mvs); 
     context.SaveChanges(); 

     int newPK = mvs.MemVoteScoresID; 

     //Update funky column ID with PK as well 
     var memVoteItem = (from m in context.tMemVoteScores 
          where m.MemVoteScoresID == newPK 
          select m).SingleOrDefault(); 

     memVoteItem.ID = memVoteItem.MemVoteScoresID; 
     context.SaveChanges(); 
     return newPK; 
    } 
+3

यह समझाना मुश्किल होगा कि चेतावनी आपको चेतावनी दोहराए बिना क्या करने के लिए कहती है। चूंकि आपके प्रकार में एक फ़ील्ड है, जहां यह उस ऑब्जेक्ट और स्टोर्स को बनाता है, जहां वह ऑब्जेक्ट IDISposable लागू करता है, आपको उस क्षेत्र में ऑब्जेक्ट का निपटान करने के साथ-साथ अपने प्रकार के आईडीस्पोजेबल को भी लागू करना चाहिए। यह मूल रूप से चेतावनी कहता है। ब्रेकिंग चेंज पार्ट यह है कि आपके प्रकार का उपयोग करने वाला कोई भी मौजूदा कोड 'डिस्प्ले' के साथ दिमाग में नहीं बनाया गया था, और इस प्रकार यह एक ब्रेकिंग चेंज था। –

उत्तर

7

आप IDisposable को लागू कर सकता है जिससे संदर्भ का निपटारा किया जाएगा जब उपभोक्ताओं को आपकी कक्षा के साथ किया जाता है, लेकिन आप बेहतर हो सकते हैं कि संदर्भ कक्षा का सदस्य न हो। बस इसे बनाने और जब आवश्यकता होती है और काम पूरा हो जाने से नष्ट:

public int AddMemVote(tMemVoteScore mvs) 
{ 
    //Insert Model 
    using(CongressDBEntities context = new CongressDBEntities()) 
    { 
     context.tMemVoteScores.Add(mvs); 
     context.SaveChanges(); 

     int newPK = mvs.MemVoteScoresID; 

     //Update funky column ID with PK as well 
     var memVoteItem = (from m in context.tMemVoteScores 
          where m.MemVoteScoresID == newPK 
          select m).SingleOrDefault(); 

     memVoteItem.ID = memVoteItem.MemVoteScoresID; 
     context.SaveChanges(); 
    } 
    return newPK; 
} 

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

+0

लेकिन मैंने सोचा कि आखिर में सब कुछ अंततः कचरे से बाहर हो जाने के बाद कचरा इकट्ठा किया गया था?लेकिन बीमार आगे बढ़ें और इसे ऊपर लपेटें जैसे कि ऊपर किया गया है अगर इससे कोड विश्लेषण को खुश कर देगा – punkouter

+1

@ पंकौटर, उस विचार प्रक्रिया के साथ समस्या यह है कि कई तरीके हैं *** *** *** कचरा संग्रह तक नहीं पहुंचती है। मेमोरी प्रबंधन, हालांकि यह .NET में स्वचालित है, विचारहीन नहीं है। उस वर्ग पर विचार करें जिसमें किसी अन्य वर्ग का संदर्भ है जिसे किसी ऑब्जेक्ट द्वारा संदर्भित किया जाता है जो हमेशा के लिए रहता है। मुझे पता है कि यह एक बढ़त मामले की तरह लगता है - लेकिन यह नहीं है। *** जब तक एप्लिकेशन बंद नहीं हो जाता तब तक उन वस्तुओं में से कोई भी कचरा कचरा नहीं होगा। –

+0

ठीक है। इसलिए मैं इसे अक्षम करने और इसे कॉल करने का तरीका यह सुनिश्चित करने का एक तरीका है कि कक्षा कचरा इकट्ठा हो जाएगी ... शायद अब इसकी आवश्यकता नहीं है, लेकिन इसे हमेशा लागू करने के लिए सबसे अच्छा अभ्यास है, वैसे भी – punkouter

3

यह दे रहा है आपको लगता है कि क्षेत्र context डिस्पोजेबल सदस्य शामिल हैं पता है। इसका मतलब है कि उन सदस्यों को Dispose() पर कॉल करने की आवश्यकता है ताकि कचरा संग्रह हो सके। इसलिए, यह चाहता है कि आप इंटरफेस IDisposable को MemVoteManager पर कार्यान्वित करें ताकि आप संदर्भ में Dispose() और/या इसके सदस्यों को डिस्पोजेबल पर कॉल कर सकें।

तो जैसे आप कोड को संशोधित:

public class MemVoteManager : AbstractDataManager, IMemVoteManager, IDisposable 

और उसके बाद इस तरह IDisposable इंटरफेस के सदस्यों को लागू:

public void Dispose() 
{ 
    // call dispose on the context and any of its members here 
} 
+0

तो मेरी कक्षा के अंदर कोई भी वर्ग जो Idisposable लागू करता है इसका मतलब है कि मुझे iDisposable को भी लागू करने की आवश्यकता है? इसके बिना मैं एक स्मृति रिसाव बना सकता हूँ? जैसा कि मैंने उपर्युक्त उल्लेख किया है, हालांकि सब कुछ कचरा इकट्ठा किया गया है .. इसका प्रबंधित कोड! – punkouter

+0

@ पंकौटर, यदि कक्षा 'आईडीस्पोजेबल' लागू करती है जिसका स्पष्ट अर्थ है कि इससे छुटकारा पाने के लिए अप्रबंधित संसाधन है। उदाहरण के लिए डेटाबेस कनेक्शन *** (वास्तविक कनेक्शन) *** - यह एक अप्रबंधित संसाधन है। इसलिए, चूंकि आपके पास एक संदर्भ ऑब्जेक्ट है, जिसमें अन्य ऑब्जेक्ट्स हैं जो अंततः अप्रबंधित संसाधनों का कारण बनती हैं, आपको ** सुनिश्चित करना होगा कि आपको उन पर 'निपटान()' कहा जाए। –

+0

लेकिन 'उपयोग' के साथ डीबीकोनटेक्स्ट को लपेटना एक idisposable लागू करने के समान होगा? – punkouter

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