C# Rfc2898DeriveBytes的版本独立代码(在.NET 4.0上有Dispose,但在2.0上没有)

C# Rfc2898DeriveBytes的版本独立代码(在.NET 4.0上有Dispose,但在2.0上没有),c#,.net,dispose,using,C#,.net,Dispose,Using,我正在编写一个与.NET 2.0兼容的小程序集,它使用Rfc2898DeriveBytes。在.NET 2.0Rfc2898DeriveBytes上不实现IDisposable,而在.NET 4.0Rfc2898DeriveBytes中实现IDisposable 我的程序集加载在.NET 4.0应用程序和.NET 2.0应用程序中 我需要使用.NET 4.0来处理Rfc2898DeriveBytes,还是像使用MemoryStream那样忽略它?如果是这样,如何编写.NET 2.0和.NET 4

我正在编写一个与.NET 2.0兼容的小程序集,它使用
Rfc2898DeriveBytes
。在.NET 2.0
Rfc2898DeriveBytes
上不实现
IDisposable
,而在.NET 4.0
Rfc2898DeriveBytes
中实现
IDisposable

我的程序集加载在.NET 4.0应用程序和.NET 2.0应用程序中

我需要使用.NET 4.0来
处理
Rfc2898DeriveBytes
,还是像使用
MemoryStream那样忽略它?如果是这样,如何编写.NET 2.0和.NET 4.0兼容的代码,仅在.NET 4.0上调用
Dispose
?(充其量不需要思考等。)

我想在该类上不使用
Dispose
并不危险,因为
IDisposable
来自
抽象类
派生字节类。

您可以:

Rfc2898DeriveBytes rfc = null;

try
{
    var salt = new byte[128];
    rfc = new Rfc2898DeriveBytes("password", salt);
}
finally
{
    IDisposable disp = rfc as IDisposable;

    if (disp != null)
    {
        disp.Dispose();
    }
}
即使使用Roslyn,编译器也不会删除作为IDisposable的
:(右窗格中,它已经处于发布模式,因此在激活优化的情况下)


(请注意,我并没有完全使用
模式复制
,我已经在
try
/
中初始化了
rfc
变量,最后
而不是外部…可能没有实际的区别)

如果查看源代码,
Dispose()
处理内部
HMACSHA1
哈希器,并用结果字节和
salt
@xanatos清除缓冲区(如
Array.Clear
):看起来像
HMACSHA1
HMAC
KeyedHashAlgorithm
HashAlgorithm
仅使用
Dispose
清理其哈希,而不释放有限的资源。因此,在这种情况下,我想我可以忽略
Dispose
?有些人不喜欢
salt
未被“清除”的事实…无论是否实现了
IDisposable
,使用
using
都不会这样做吗?@leppie
using
如果在编译时不知道实现
IDisposable
@hvd的类型,则会给出一个编译时错误:也许他们应该对其进行改进,以满足以下要求:D@leppie也许你/他们不应该添加
IDisposable
界面。。。这被认为是一个突破性的变化。From:将IDisposable接口添加到现有类中是一个破坏性的更改,因为它更改了类的语义。@leppie您可以编写
var rfc=new Rfc2898DeriveBytes(“password”,salt);使用(rfc作为IDisposable){…}
如果您认为这样更可读的话。我不认为扩展
using
语句不再给出错误是一种改进,因为我怀疑这只会让人们认为应该始终使用
using
,不管它是否合理。