有人能告诉我如何从下面的代码中删除所有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.针对这些评论:

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

.net相关问答推荐

.NET 4.5 项目未在 Visual Studio 2022 中编译

如何在不违反继承安全规则的情况下在 .NET 4+ 中实现 ISerializable?

C# 事件是同步的吗?

Visual Studio 2017 和 2019 突出显示滚动条中所选单词的出现

为什么 ?: 会导致转换错误,而 if-else 不会?

在 web api 控制器(.net 核心)中使用 async/await 或任务

xunit Assert.ThrowsAsync() 不能正常工作?

为什么具有可为空值的结构的 HashSet 非常慢?

等效于 C# 在 powershell 中的“使用”关键字?

这在技术上是“Hello World”的 O(1) 算法吗?

如何使我的托管 NuGet 包支持 C++/CLI 项目?

Visual Studio 2015 项目不再在调试模式下运行

将 C# 编译为本机?

为什么使用 ImmutableList 而不是 ReadOnlyCollection?

C# 6.0 是否适用于 .NET 4.0?

为什么我不能在 lambda 表达式中使用空传播运算符?

写入 Windows 应用程序事件日志(log)

创建一个已完成的任务

如何在 RabbitMQ 中设置重试次数?

如何防止任务的同步延续?