Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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# CA2202与Dispose的代码分析问题_C#_Visual Studio 2017 - Fatal编程技术网

C# CA2202与Dispose的代码分析问题

C# CA2202与Dispose的代码分析问题,c#,visual-studio-2017,C#,Visual Studio 2017,我无法集中精力解决这些代码分析警告 代码如下: public static string Crypt(string s_Data, string s_Password, bool b_Encrypt) { byte[] u8_Salt = new byte[] { ... }; PasswordDeriveBytes i_Pass = new PasswordDeriveBytes(s_Password, u8_Salt); Ri

我无法集中精力解决这些代码分析警告

代码如下:

   public static string Crypt(string s_Data, string s_Password, bool b_Encrypt)
    {
        byte[] u8_Salt = new byte[] { ... };

        PasswordDeriveBytes i_Pass = new PasswordDeriveBytes(s_Password, u8_Salt);

        Rijndael i_Alg = Rijndael.Create();
        i_Alg.Key = i_Pass.GetBytes(32);
        i_Alg.IV = i_Pass.GetBytes(16);

        ICryptoTransform i_Trans = (b_Encrypt) ? i_Alg.CreateEncryptor() : i_Alg.CreateDecryptor();

        MemoryStream i_Mem = new MemoryStream();
        CryptoStream i_Crypt = new CryptoStream(i_Mem, i_Trans, CryptoStreamMode.Write);

        byte[] u8_Data;
        if (b_Encrypt)
            u8_Data = Encoding.Unicode.GetBytes(s_Data);
        else
            u8_Data = Convert.FromBase64String(s_Data);

        try
        {
            i_Crypt.Write(u8_Data, 0, u8_Data.Length);
            i_Crypt.Close();
            if (b_Encrypt)
                return Convert.ToBase64String(i_Mem.ToArray());
            else
                return Encoding.Unicode.GetString(i_Mem.ToArray());
        }
        catch
        {
            return null;
        }
        finally
        {
            i_Crypt.Close();
        }
    }
正在i_Crypt.Close()上引发错误呼叫。我可以看到我的代码中有两次这样的调用

错误:

只需拆下封口();从你的试块

try
{
    i_Crypt.Write(u8_Data, 0, u8_Data.Length);
    if (b_Encrypt)
        return Convert.ToBase64String(i_Mem.ToArray());
    else
        return Encoding.Unicode.GetString(i_Mem.ToArray());
}
catch
{
    return null;
}
finally
{
    i_Crypt.Close();
}
更好的是,如果您稍微尝试一下,您可能会在using块中使用MemoryStream和加密流

只需拆下封口();从你的试块

try
{
    i_Crypt.Write(u8_Data, 0, u8_Data.Length);
    if (b_Encrypt)
        return Convert.ToBase64String(i_Mem.ToArray());
    else
        return Encoding.Unicode.GetString(i_Mem.ToArray());
}
catch
{
    return null;
}
finally
{
    i_Crypt.Close();
}
更好的是,如果您稍微尝试一下,您可能会在using块中使用MemoryStream和加密流


您正在
try
主体内以及
finally
中处理它-只需取出
try
中的一个,只需从try块中删除i_Crypt.Close(),因为finally总是被执行。尽管多次处理对象是一种应该消除的坏代码气味,这个警告有些误导。在第二个dispose上抛出ObjectDisposedException的对象有bug;MSDN文档说明Dispose必须是幂等的。您在
try
主体内以及
finally
中处理它-只需取出
try
中的一个,只需从try块中删除i_Crypt.Close(),虽然多次处理一个对象是一种不好的代码味道,应该消除,但警告有点误导。在第二个dispose上抛出ObjectDisposedException的对象有bug;MSDN文档说明Dispose必须是幂等的。那么,您是说使用
代码块的
将自动调用
close()
调用?这样我就明白了。谢谢。实际上它正在调用IDisposable而不是Close()定义的Dispose()方法。我不确定Close()是否正在做一些Dispose没有做的额外清理工作,但在对象上使用using块和调用.Close()可能会有所不同。因此,您是说
using
代码块将自动调用
Close()
调用?这样我就明白了。谢谢。实际上它正在调用IDisposable而不是Close()定义的Dispose()方法。我不确定Close()是否正在执行Dispose没有执行的其他清理工作,但使用using块和调用对象上的.Close()可能会有所不同。