1

有人会为我解释一下以下 C# 代码吗?

我确实了解 IDisposable 的正常用法。但我不明白下面的代码。new LogLog.LogReceivedAdapter(configurationMessages)的实例化看起来与关键字 using 中的代码块无关。语句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;
}
4

3 回答 3

1

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

  • LogLog 在构造时注册configurationMessages在某个静态类(我们称之为Log)中;
  • InternalConfigure 使用该静态类(实际上配置消息已填满)
  • LogLog 类的 Dispose() 方法从类中移除适配器Log

您提出的部分需要大量猜测,但我相信,情况就是如此。

于 2013-06-25T07:35:40.077 回答
1

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

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

    handler = new LogReceivedEventHandler(LogLog_LogReceived);

    LogReceived += handler;
} 

正如你所看到的,它在背后做了一些魔法,因此——即使你的代码中没有直接引用新创建的实例——它也可能有一定的意义:)

于 2013-06-25T07:37:16.120 回答
0

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

于 2013-06-25T07:38:42.940 回答