我正在对项目进行一些代码分析并实施有意义的建议。一个建议是执行以下操作:
CA2000:Microsoft。可靠性:方法 'Service.ParseConfigurationFile()',调用System.IDisposable.Dispose 对象'new SecureString()'在所有引用之前都没有 范围
违规行如下:
Password = me.Password.Aggregate(new SecureString(), (secureString, c) => { secureString.AppendChar(c); return secureString; })
有关如何正确执行此操作的任何想法?我已经用下面的行替换了上面的内容,但我认为它不正确,因为它仍然会导致代码分析消息出现:
Password = me.Password.Aggregate(new SecureString(), (secureString, c) => { using (secureString) {secureString.AppendChar(c); return secureString;} })
编辑:根据来自@Jon的评论,objectInstance是一个名为MailboxElement(me)的自定义类的实例。它在配置文件中经历了多个自定义部分,如下所示:
foreach (MailboxElement me in mailboxesSection.Mailboxes)
{
MailboxInformation mailboxInformation = new MailboxInformation
{
ExchangeServerWebServiceUrl = me.ExchangeServerWebServiceUrl,
MailboxFriendlyName = me.FriendlyName,
UserName = me.UserName,
Password = me.Password.Aggregate(new SecureString(), (secureString, c) => { secureString.AppendChar(c); return secureString; }),
MailboxToAccess = me.MailboxToAccess
};
// Do stuff with mailboxInformation here
}
MailboxElement
是一个密封的类,它实现ConfigurationElement,具有上述所有属性。
MailboxInformation
定义如下:
public class MailboxInformation
{
public string MailboxFriendlyName { get; set; }
public string UserName { get; set; }
public SecureString Password { get; set; }
public string ExchangeServerWebServiceUrl { get; set; }
public string MailboxToAccess { get; set; }
public string InboxFolderId { get; set; }
public string SentItemsFolderId { get; set; }
public bool MailboxSettingsDiscovered { get; set; }
}
我希望这会让事情变得更清楚......
答案 0 :(得分:3)
您正在从聚合中返回一个IDispoable,因此您需要将其丢弃或只是重新分配给secureString
using (var secureString = new SecureString()) {
secureString = objectInstance.Password.Aggregate((secureString, c) => { secureString.AppendChar(c); return secureString; }){
}
问题更新后编辑
由于您的MailboxInformation
对象现在获得了IDisposable的所有权MailboxInformation
它本身应该是IDisposable并处置它所拥有的一次性用品
因此实施将(与您的评论类似)
public class MailboxInformation : IDisposeable
{
//...
public SecureString Password { get; set; }
//...
void IDisposable.Dispose() {
this.Password.Dispose();
}
}
答案 1 :(得分:1)
请尝试以下格式:
using (var secureString = new SecureString()) {
Password = objectInstance.Password.Aggregate([...])
}
最好将整个事情包含在我认为的using
声明中。
答案 2 :(得分:1)
通过这个链接,它是一个破碎的规则,不需要考虑那个,请忽略该规则。