不明白IDisposable的使用

时间:2013-06-25 07:28:02

标签: c# log4net idisposable

有人会为我解释下面的C#代码吗?

我确实知道IDisposable 的正常用法。但我不明白以下代码。 new LogLog.LogReceivedAdapter(configurationMessages)的实例化看起来与关键字使用中的代码块无关。语句 InternalConfigure(repository,configFile)最终如何更新变量 configurationMessages

顺便说一下,代码片段是从log4net中获取的XmlConfigurator.cs#508

static public ICollection Configure(ILoggerRepository repository, FileInfo configFile)
{
    ArrayList configurationMessages = new ArrayList();

    using (new LogLog.LogReceivedAdapter(configurationMessages))
    {
        InternalConfigure(repository, configFile);
    }

    repository.ConfigurationMessages = configurationMessages;

    return configurationMessages;
}

3 个答案:

答案 0 :(得分:1)

我不知道确切的代码,但可能如下所示:

  • LogLog在构建时在一些静态类中注册configurationMessages(我们称之为Log);
  • InternalConfigure使用该静态类(并且实际上是配置消息已填满)
  • LogLog类的Dispose()方法从Log类中删除适配器。

你提出的部分需要大量猜测,但我相信,情况确实如此。

答案 1 :(得分:1)

我相信LogReceivedAdapter的构造函数是一个答案。

public LogReceivedAdapter(IList items)
{
    this.items = items;

    handler = new LogReceivedEventHandler(LogLog_LogReceived);

    LogReceived += handler;
} 

正如你所看到的,它背后有一些魔力 - 即使你的代码中没有直接引用新创建的实例 - 它可能有一定意义:)

答案 2 :(得分:0)

C#以一种特定的方式处理实现IDisposable的类:它在代码到达创建对象的“using”块的右括号时调用Dispose()。 查看LogLog.LogReceivedAdapter的Dispose()方法。代码确保调用此方法。