如何在lambda表达式中使用IDisposable?

时间:2012-07-03 10:05:42

标签: c# linq lambda

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

  

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

我希望这会让事情变得更清楚......

3 个答案:

答案 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)

通过这个链接,它是一个破碎的规则,不需要考虑那个,请忽略该规则。

CA2000 passing object reference to base constructor in C#

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