2012-02-02 15 views
8

मैं इस पद्धति पर कोड विश्लेषण के नियमों का पालन करने की कोशिश की है निपटान नहीं है:कोड विश्लेषण - वस्तु कई बार

public static string Encrypt(string password) 
{ 
    string myPassword = string.Empty; 
    if (!string.IsNullOrEmpty(password)) 
    { 
     myPassword = password; 
     byte[] Value = System.Text.Encoding.UTF8.GetBytes(myPassword); 
     SymmetricAlgorithm mCSP = new RijndaelManaged(); 
     mCSP.Key = _key; 
     mCSP.IV = _initVector; 
     using (ICryptoTransform ct = mCSP.CreateEncryptor(mCSP.Key, mCSP.IV)) 
     { 
      using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) 
      { 
       using (CryptoStream cs = new CryptoStream(ms, ct, CryptoStreamMode.Write)) 
       { 
        cs.Write(Value, 0, Value.Length); 
        cs.FlushFinalBlock(); 
        cs.Close(); 
        myPassword = Convert.ToBase64String(ms.ToArray()); 
       } 
      } 
     } 
    } 
    return myPassword; 
} 

सभी Try {} Finaly{} ब्लॉक जोड़ा है, लेकिन यह अभी भी मुझ पर चिल्ला रहा था कि मैं सम्मान नियम न 2202. कोई मुझे इस के साथ हाथ दे सकता है?

हाँ, मैंने इस विषय के बारे में अन्य पोस्ट पढ़ी हैं और इसे लागू करने का प्रयास किया है, लेकिन अंत में मुझे अभी भी वही संदेश मिलता है।

उत्तर

13

cs के लिए CA2202 चेतावनी से छुटकारा पाने के लिए, बस Close विधि पर कॉल को हटा दें।

ms के लिए CA2202 समस्या एक और अधिक जटिल है। चेतावनी बढ़ रही है क्योंकि CryptoStream में कन्स्ट्रक्टर के माध्यम से प्राप्त धारा को निपटाने के लिए effrontery है, जिसका अर्थ है कि ms.Close() पर एक अनुचित कॉल है जिसे आप टालना नहीं कर सकते हैं। अच्छी खबर यह है कि इस असाधारण स्वभाव के आपके मामले में कोई दुष्प्रभाव नहीं है, और यह डबल स्वभाव के लिए भी जाता है, ताकि आप SuppressMessageAttribute पर सुरक्षित रूप से थप्पड़ मार सकें और समस्या को अनदेखा कर सकें। (उन मामलों के लिए जहां आपको वास्तव में CryptoStream जैसे कुछ अपरिवर्तनीय स्वभाव से बचने के लिए धारा पारित करने की आवश्यकता है, सामान्य तकनीक एक धारा उपclass का उपयोग करना है जिसका स्वभाव अपने तत्काल कोड द्वारा रोका जा सकता है।)

+2

मुझे वास्तव में किसी भी "त्रुटियों" को suppresing पसंद नहीं है, शायद मुझे अपना कोड दोबारा करना चाहिए? – Dementic

2

इन दो पंक्तियों से छुटकारा, वे आवश्यक नहीं हैं:

cs.FlushFinalBlock(); 
cs.Close(); 
+2

और ले जाने के 'mypassword = Convert.ToBase64String (ms.ToArray());' माता पिता गुंजाइश के लिए, यह सुनिश्चित करें कि 'cs' ** है ** प्लावित कर दिया गया! –

+0

अभी भी 'ms' पर नियम 2202 प्राप्त कर रहा है। – Dementic

2

documentation on this topic के बाद इस कोड के लिए नेतृत्व करना चाहिए:

public static string Encrypt(string password) 
{ 
    string myPassword = string.Empty; 
    if (!string.IsNullOrEmpty(password)) 
    { 
     myPassword = password; 
     byte[] Value = System.Text.Encoding.UTF8.GetBytes(myPassword); 
     SymmetricAlgorithm mCSP = new RijndaelManaged(); 
     mCSP.Key = _key; 
     mCSP.IV = _initVector; 
     using (ICryptoTransform ct = mCSP.CreateEncryptor(mCSP.Key, mCSP.IV)) 
     { 
      System.IO.MemoryStream ms = null; 
      try 
      { 
       ms = new System.IO.MemoryStream() 
       var tmp = ms; 
       using (CryptoStream cs = new CryptoStream(ms, ct, 
                 CryptoStreamMode.Write)) 
       { 
        ms = null; 

        cs.Write(Value, 0, Value.Length); 
        cs.FlushFinalBlock(); 
        cs.Close(); 
        myPassword = Convert.ToBase64String(tmp.ToArray()); 
       } 
      } 
      finally 
      { 
       if(ms != null) 
        ms.Dispose(); 
      } 
     } 
    } 
    return myPassword; 
} 
+0

अभी भी 'cs' पर नियम 2202 और' ms' – Dementic

+0

@Dementic क्या है यदि आपने ऐसा किया है, लेकिन 'cs.Close()' से छुटकारा पा लिया है? यानी हमारे उत्तरों का संयोजन – Ray

+0

कोडों का संयोजन भी काम नहीं करेगा, मुझे अभी भी 'ms' – Dementic

2

इस विश्लेषण चेतावनी पर दस्तावेज़ (http://msdn.microsoft.com/en-us/library/ms182334.aspx) इस उदाहरण, जो आपके जैसा में देता है कि यह धाराओं जोड़ तोड़ रहा है:

Stream stream = null; 
try 
{ 
    stream = new FileStream("file.txt", FileMode.OpenOrCreate); 
    using (StreamWriter writer = new StreamWriter(stream)) 
    { 
     stream = null; 
     // Use the writer object... 
    } 
} 
finally 
{ 
    if(stream != null) 
     stream.Dispose(); 
} 

लेकिन यह अभी भी त्रुटि देता है। निम्नलिखित त्रुटि हल करेंगे:

Stream stream = null; 
StreamWriter writer = null; 
try 
{ 
    stream = new FileStream("file.txt", FileMode.OpenOrCreate); 
    writer = new StreamWriter(stream)) 

    // Do some stuff on the stream writer.. 
} 
finally 
{ 
    if(writer != null) 
     writer.Dispose(); 
    else if(stream != null) 
     stream.Dispose(); 
} 

कारण सरल है; अगर लेखक हमेशा आपके लिए धारा का निपटान करेगा। केवल परिदृश्य में लेखक को सफलतापूर्वक बनाया नहीं जाना चाहिए, क्या आप खुद को स्ट्रीम का निपटान कर सकते हैं। लेकिन मुझे यह स्वीकार करना होगा कि मुझे निम्न वाक्यविन्यास बहुत पसंद है, और यदि आप फ़ाइलस्ट्रीम के बजाय मेमोरीस्ट्रीम बनाते हैं तो अपवाद होने का मौका छोटा होता है और मैं सीए को दबाकर पसंद करूंगा। कृपया ध्यान दें कि आप कथन का उपयोग करके ढेर कर सकते हैं, इसलिए अतिरिक्त 'घोंसले स्तर' की अक्सर आवश्यकता नहीं होती है।

using (Stream stream = new FileStream("file.txt", FileMode.OpenOrCreate)) 
using (StreamWriter writer = new StreamWriter(stream)) 
{ 
    // Use the writer object... 
} 
+0

आप कब्र खोदना पसंद करते हैं?;) यदि स्ट्रीम सफलतापूर्वक नहीं बनाई गई है, तो इसे निपटाने की कोई आवश्यकता नहीं है .. दमन, जैसा कि मैंने ऊपर दिए गए उत्तर में टिप्पणी की है, ऐसा कुछ नहीं है जिसे मैं करना चाहता हूं। मैं कोड को फिर से फैक्टर करके कोड को ठीक करने में कामयाब रहा। – Dementic

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