2013-12-18 9 views
9

विधि के लिए रेफ परम के रूप में IDISposable ऑब्जेक्ट्स मैं कक्षा के एक रिफैक्टरिंग कर रहा था और एक अलग विधि में 100 लाइनों को स्थानांतरित करने के विचार कर रहा था। इस तरह:विधि

using iTextSharp.text; 
using iTextSharp.text.pdf; 

class Program 
{ 
    private static void Main(string[] args) 
    { 
     Document doc = new Document(iTextSharp.text.PageSize.LETTER, 10, 10, 42, 35); 
     using (var mem = new MemoryStream()) 
     { 
      using (PdfWriter wri = PdfWriter.GetInstance(doc, mem)) 
      { 
       doc.Open(); 
       AddContent(ref doc, ref wri); 
       doc.Close(); 
       File.WriteAllBytes(@"C:\testpdf.pdf", mem.ToArray()); 
      } 
     } 
    } 

    public static void AddContent(ref Document doc, ref PdfWriter writer) 
    { 
     var header = new Paragraph("My Document") { Alignment = Element.ALIGN_CENTER }; 
     var paragraph = new Paragraph("Testing the iText pdf."); 
     var phrase = new Phrase("This is a phrase but testing some formatting also. \nNew line here."); 
     var chunk = new Chunk("This is a chunk."); 
     doc.Add(header); 
     doc.Add(paragraph); 
     doc.Add(phrase); 
     doc.Add(chunk); 

    } 
} 

संकलक की विधि बुला पर अपवाद फेंकता है: केवल पढ़ने के लिए स्थानीय चर एक काम लक्ष्य डॉक और सदस्य के लिए के रूप में इस्तेमाल नहीं किया जा सकता।

संपादित करें: यहां केवल मैं pdf दस्तावेज़ में किसी अन्य विधि में सामग्री जोड़ रहा हूं। तो मुझे एक ही डॉक्टर ऑब्जेक्ट को पास करने की ज़रूरत है, है ना? तो मैं ref या param का उपयोग क्यों नहीं कर सकता।

तकनीकी रूप से usingref परम के उद्देश्य को निलंबित करता है।

MSDN पर देखने के लिए कोशिश की: केवल विधि के बुला पर

A ReadOnly property has been found in a context that assigns a value to it. 
Only writable variables, properties, and array elements can have values assigned 
to them during execution. 

वस्तुओं को कैसे पढ़ हो? दायरे के भीतर वस्तु जीवित है और आप जो भी चाहें कर सकते हैं।

+0

कृपया समस्या का प्रदर्शन करने वाला एक छोटा लेकिन * पूरा * कार्यक्रम दिखाएं। –

+0

नहीं, यह एक छोटा लेकिन पूरा कार्यक्रम नहीं है। "लघु लेकिन पूर्ण कार्यक्रम" से मेरा मतलब है "कुछ मैं प्रतिलिपि बना सकता हूं और एक नई पाठ फ़ाइल में पेस्ट कर सकता हूं, संकलित और बिना किसी बदलाव के चला सकता हूं"। –

+0

इसे एक नई टेक्स्ट फ़ाइल में कॉपी करने और चिपकाने का प्रयास करें और इसे संकलित करें। 'दस्तावेज़' वर्ग क्या है? 'पीडीएफवाइटर' वर्ग क्या है? 'Paragraph'? 'Chunk'? 'Phrase'? मुझे दृढ़ता से संदेह है कि वे इस प्रश्न के लिए अप्रासंगिक हैं, और आपको केवल * कुछ * 'आईडीस्पोजेबल 'कार्यान्वयन की आवश्यकता है - इसलिए बीसीएल के भीतर एक का उपयोग करें, और उपयुक्त' उपयोग 'निर्देश जोड़ें। –

उत्तर

12

ऐसा इसलिए है क्योंकि आप using कीवर्ड का उपयोग करके doc और mem घोषित करते हैं। उद्धरण MSDN:

उपयोग ब्लॉक के भीतर, ऑब्जेक्ट केवल पढ़ने के लिए है और इसे संशोधित या पुन: असाइन नहीं किया जा सकता है।

इसलिए आपको केवल पढ़ने योग्य चर के बारे में त्रुटि मिलती है।


आप अभी भी संदर्भ द्वारा मानकों पास करना चाहते हैं, तो आप try ... finallyusing के बजाय ब्लॉक का उपयोग कर सकते हैं। जैसा कि जॉन स्कीट द्वारा इंगित किया गया है, यह कोड using का विस्तार किया गया है, लेकिन using कथन के साथ, यह हमेशा मूल वस्तु है जिसे निपटान किया जाता है। नीचे दिए गए कोड में, यदि AddContentdoc के मान को बदलता है, तो यह बाद में मूल्य Dispose कॉल में उपयोग किया जाएगा।

var doc = new Document(PageSize.A4, 5f, 5f, 5f, 5f); 
try 
{ 
    var mem = new MemoryStream(); 
    try 
    { 
     PdfWriter wri = PdfWriter.GetInstance(doc, output); 
     doc.Open(); 
     AddContent(ref doc,ref wri); 
     doc.Close(); 
    } 
    finally 
    { 
     if (mem != null) 
      ((IDisposable)mem).Dispose(); 
    } 
} 
finally 
{ 
    if (doc != null) 
     ((IDisposable)doc).Dispose(); 
} 
return output.ToArray(); 
+0

+1 यह मेरी मदद और व्याख्या करने के लिए +1 है, लेकिन यह मेरी समस्या हल नहीं करता है। – joshua

+0

इस समस्या के आसपास एक तरीके के लिए मेरे संपादन देखें। – Szymon

+1

यह * 'उपयोग' के समान कोड नहीं है - क्योंकि 'उपयोग' कथन के साथ, यह हमेशा * मूल * ऑब्जेक्ट होता है जिसे निपटाया जाता है। आपके "समतुल्य" कोड में, यदि 'AddContent' 'doc' के मान को बदलता है, तो यह बाद का मान होगा जिसका उपयोग' निपटान 'कॉल में किया जाता है। –

6

परिवर्तनीय using कीवर्ड की वजह से पाठक है। जब आप चर के संदर्भ के ओवरराइड करते हैं तो कंपाइलर को अन्यथा पता होना चाहिए कि उसे उपयोग-स्कोप छोड़ते समय निपटान करना होगा।

लेकिन आपको ref कीवर्ड का उपयोग क्यों करना है? मेरी राय में आपको एक रेफरी की आवश्यकता नहीं है।

+0

यहां रेफ की आवश्यकता नहीं हो सकती है। 'पीडीएफ' दस्तावेज़ उत्पन्न करने की आवश्यकता लें, आपको उसी दस्तावेज़ ऑब्जेक्ट को बनाए रखने की आवश्यकता है। यह जो मैंने किया है। – joshua

+0

सिद्धांत रूप में, 'उपयोग' के आस-पास का अनुबंध" ब्लॉक के अंत में चर में जो कुछ भी है "को डिस्पोजेक्ट कर सकता है, इसलिए यदि आप इसे स्विच करते हैं तो यह केवल आपके द्वारा स्विच किए जाने वाले किसी भी प्रकार का निपटान करेगा ... लेकिन यह नहीं है:) "आपको एक रेफरी की आवश्यकता नहीं है" के लिए +1। – Rawling

+0

@ जोशुआ: आपको * वास्तव में * यह सुनिश्चित करने की ज़रूरत है कि आप समझें कि 'रेफरी' क्या करता है। सी # का सही उपयोग करने के लिए यह महत्वपूर्ण है। प्रश्न टिप्पणियों में शामिल लिंक देखें। मुझे पूरा यकीन है कि 'रेफरी' को हटाकर * सबसे अच्छा * समाधान है। –