3

我正在对项目进行一些代码分析并实施有意义的建议。一个建议是执行以下操作:

CA2000:Microsoft.Reliability:在方法“Service.ParseConfigurationFile()”中,在对对象“new SecureString()”的所有引用超出范围之前调用 System.IDisposable.Dispose

违规行如下:

 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(我)的自定义类的实例。它通过配置文件中的多个自定义部分,如下所示:

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; }
}

我希望这能让事情更清楚......

4

3 回答 3

3

您正在从 Aggregation 返回 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();
   }
}
于 2012-07-03T10:29:37.283 回答
1

试试这种格式:

using (var secureString = new SecureString()) {
    Password = objectInstance.Password.Aggregate([...])
}

我相信最好将整个事情包含在一个using声明中。

于 2012-07-03T10:10:14.890 回答
1

通过此链接,这是一条不规则的规则,无需考虑该规则,请忽略该规则。

CA2000 将对象引用传递给 C# 中的基本构造函数

http://www.debugging.com/bug/24060

于 2012-07-03T10:12:49.623 回答