Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 代码分析-不要多次处理对象_C#_Code Analysis - Fatal编程技术网

C# 代码分析-不要多次处理对象

C# 代码分析-不要多次处理对象,c#,code-analysis,C#,Code Analysis,我尝试过遵循此方法的代码分析规则: public static string Encrypt(string password) { string myPassword = string.Empty; if (!string.IsNullOrEmpty(password)) { myPassword = password; byte[] Value = System.Text.Encoding.UTF8.GetBytes(myPassword

我尝试过遵循此方法的代码分析规则:

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{}finally{}
块,但它仍然对我大喊大叫,说我不遵守规则2202。 有人能帮我吗

是的,我读过关于这个主题的其他帖子,并尝试应用它,
但最后我还是得到了同样的信息。

去掉这两行,它们是不需要的:

cs.FlushFinalBlock();
cs.Close();
以下内容应导致此代码:

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;
}

要消除针对
cs
的CA2202警告,只需删除对其
Close
方法的调用


ms
的CA2202问题稍微复杂一点。出现警告是因为
CryptoStream
厚颜无耻地处理它通过is构造函数接收到的流,这意味着对
ms.Close()
有一个不适当的调用,您无法避免。好消息是,这种不合时宜的处理方式在您的情况下没有副作用,而双重处理方式也没有副作用,因此您可以安全地使用
SuppressMessageAttribute
并忽略问题。(对于实际需要通过类似于
CryptoStream
的方式传递流以在其不可预防的处置中生存的情况,通常的技术是使用流子类,其处置可以通过其实例化代码来阻止。)

有关此分析警告()的文档给出了此示例,与您的类似之处在于,它在处理流:

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();
}
原因很简单,;如果编写器总是为您处理流。只有在场景中,如果您自己处理流,则写入程序未成功创建。但我必须承认,我更喜欢下面的语法,如果创建MemoryStream而不是FileStream,则发生异常的可能性很小,我更喜欢抑制CA。请注意,可以使用语句进行堆栈,因此通常不需要额外的“嵌套级别”

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

移动
myPassword=Convert.ToBase64String(ms.ToArray())
到父作用域,以确保已刷新
cs
!仍然在
ms
上获取规则2202。仍然在
cs
ms
@Dementic上获取规则2202如果您这样做了,但删除了
cs.Close()
?i、 e.我们答案的组合七个代码的组合不起作用,我仍然在新编辑的
ms
cs
上得到2202。我在家里试过这些东西。。。但我不明白为什么它一直在发生……我真的不喜欢抑制任何“错误”,也许我应该重构我的代码?你喜欢挖坟墓吗?;)如果未成功创建流,则无需对其进行处理。。正如我在上面的回答中所评论的,压制不是我喜欢做的事情。我通过重新分解代码来修复代码。