C# Rfc2898DeriveBytes的版本独立代码(在.NET 4.0上有Dispose,但在2.0上没有)
我正在编写一个与.NET 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
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.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
都不会这样做吗?@leppieusing
如果在编译时不知道实现IDisposable
@hvd的类型,则会给出一个编译时错误:也许他们应该对其进行改进,以满足以下要求:D@leppie也许你/他们不应该添加IDisposable
界面。。。这被认为是一个突破性的变化。From:将IDisposable接口添加到现有类中是一个破坏性的更改,因为它更改了类的语义。@leppie您可以编写var rfc=new Rfc2898DeriveBytes(“password”,salt);使用(rfc作为IDisposable){…}
如果您认为这样更可读的话。我不认为扩展using
语句不再给出错误是一种改进,因为我怀疑这只会让人们认为应该始终使用using
,不管它是否合理。