有人能告诉我如何从下面的代码中删除所有CA2202警告吗?

public static byte[] Encrypt(string data, byte[] key, byte[] iv)
{
    using(MemoryStream memoryStream = new MemoryStream())
    {
        using (DESCryptoServiceProvider cryptograph = new DESCryptoServiceProvider())
        {
            using (CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptograph.CreateEncryptor(key, iv), CryptoStreamMode.Write))
            {
                using(StreamWriter streamWriter = new StreamWriter(cryptoStream))
                {
                    streamWriter.Write(data);
                }
            }
        }
        return memoryStream.ToArray();
    }
}

警告7 CA2202:Microsoft.Usage:对象""CryptoStream""可以在方法""CryptoServices.Encrypt(string,byte[],byte[])""中释放多次."若要避免生成System.ObjectDisposedException,不应对一个对象多次调用Dispose.语法:LINES:34

警告8 CA2202:Microsoft.用法:对象"memoryStream"可以在方法"CryptoServices"中多次释放.加密(字符串,字节[],字节[]).避免生成系统.ObjectDisposedException您不应该对一个对象多次调用Dispose:线路:34、37

您需要Visual Studio代码分析才能看到这些警告(这些不是C#编译器警告).

推荐答案

这将在没有警告的情况下编译:

    public static byte[] Encrypt(string data, byte[] key, byte[] iv)
    {
        MemoryStream memoryStream = null;
        DESCryptoServiceProvider cryptograph = null;
        CryptoStream cryptoStream = null;
        StreamWriter streamWriter = null;
        try
        {
            memoryStream = new MemoryStream();
            cryptograph = new DESCryptoServiceProvider();
            cryptoStream = new CryptoStream(memoryStream, cryptograph.CreateEncryptor(key, iv), CryptoStreamMode.Write);
            var result = memoryStream;              
            memoryStream = null;
            streamWriter = new StreamWriter(cryptoStream);
            cryptoStream = null;
            streamWriter.Write(data);
            return result.ToArray();
        }
        finally
        {
            if (memoryStream != null)
                memoryStream.Dispose();
            if (cryptograph != null)
                cryptograph.Dispose();
            if (cryptoStream != null)
                cryptoStream.Dispose();
            if (streamWriter != null)
                streamWriter.Dispose();
        }
    }

Edit.针对这些 comments :

修改后的代码的工作原理如下:只要处置责任转移到另一个对象,引用就被设置为null.例如,在调用CryptoStream构造函数成功后,memoryStream被设置为null.在调用StreamWriter构造函数成功后,将cryptoStream设置为null.如果没有发生异常,则在finally块中处理streamWriter,并依次处理CryptoStreamMemoryStream.

.net相关问答推荐

为什么 PropertyInfo.SetValue 在此示例中不起作用以及如何使其起作用?

EFCore.DbSet.Update 方法添加新行而不是更新它

有没有更好的方法使用 Pusher Channels 的批事件发布消息?

从 Contentful 中的富文本元素中获取价值?

maxRequestLength 的最大值?

每 X 秒执行一次指定函数

在 .NET C# 中存储加密密钥的最佳方式

通用枚举到int的C#非装箱转换?

如何在 C# 中创建 Word 文档?

为什么递归调用会导致不同堆栈深度的 StackOverflow?

ASP.NET Core 等效于 ASP.NET MVC 5 的 HttpException

Await 运算符只能在 Async 方法中使用

我们应该总是在类中包含一个默认构造函数吗?

在 C# 中将匿名类型转换为键/值数组?

无法加载文件或程序集System.ValueTuple

自创建数据库以来,支持ApplicationDbContext上下文的模型已更改

嵌套的 Try/Catch 块是个坏主意吗?

功能说明

如何重新启动 WPF 应用程序?

从不同程序集中的类名中解析类型