在使用构造之前声明一次性对象的好处

时间:2019-02-25 17:34:43

标签: c#

我正在阅读Logging Sample,并且发现LoggerFactoryusing之外定义。

var loggerFactory = LoggerFactory.Create(builder =>
{
    builder
        .AddConsole()
        .AddEventLog();
});

// Make sure to dispose ILoggerFactory
using (loggerFactory)
{
    var logger = loggerFactory.CreateLogger<Program>();

    logger.LogInformation("Starting");
}

问题

最常用的模式如下。

using(var loggerFactory = LoggerFactory.Create(...))
{
...
}

using之外声明一个可丢弃对象,然后由using自动处置它有什么好处?

4 个答案:

答案 0 :(得分:5)

在使用时声明一次性对象然后通过使用使其自动处置有什么好处?

不多,我不认为。

using子句中声明它似乎更明智,因为如果不小心尝试在using子句之外使用它,则会出现编译错误。

答案 1 :(得分:2)

我能想到的唯一原因就是可读性。

答案 2 :(得分:1)

可读性强。如果看起来像这样,将很难阅读:

using (var loggerFactory = LoggerFactory.Create(builder =>
    {
        builder
            .AddConsole()
            .AddEventLog();
    }))
{
    var logger = loggerFactory.CreateLogger<Program>();

    logger.LogInformation("Starting");
}

如果在心理上解析它需要花费额外的几秒钟,并且它可能更简单,那么它应该会更简单。尽管,如其他答案所述,这意味着您可以拥有已处置但仍在范围内的对象。 using将两者结合起来,确保在处置时不在范围之内。

现在,您可以花这几秒钟来弄清楚为什么它使用静态类创建工厂并调用工厂来创建记录器,而不仅仅是注入记录器。

答案 3 :(得分:1)

我认为这样做是为了便于初始化。

我反对这种语法,因为对象的生存期未绑定到using上下文。
对我来说,有一个处置对象后使用它的风险。也许有一天,您在using块之前会遇到一个错误,因此该对象将不会被处置。

我认为,您应该将对象的初始化移动到另一个方法中,并在using指令中调用它。

编辑
阅读示例之后,我意识到我应该记住以下几件事:这是一个示例。这样,就可以在main方法中放入一个文件程序中。
因此,绝对可以肯定,我认为最好在外部方法中提取实例化,然后在using指令中对其进行调用,以在使用时保持对象的生存期。