首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ILogger<T>?默认为null与ILogger<T>默认为NullLogger<T>

ILogger<T>?默认为null与ILogger<T>默认为NullLogger<T>
EN

Stack Overflow用户
提问于 2022-06-04 17:41:40
回答 1查看 252关注 0票数 0

参加以下两门课程:

代码语言:javascript
复制
public class PersonA
{
    private readonly ILogger<PersonA> _logger;

    public PersonA() : this(new NullLogger<PersonA>())
    {}
    
    public PersonA(ILogger<PersonA> logger)
    {
        _logger = logger;
    }

    public void SomeMethod()
    {
        _logger.LogDebug("SomeMethod invoked");
    }
}

public class PersonB
{
    private readonly ILogger<PersonB>? _logger;

    public PersonB(ILogger<PersonB>? logger = null)
    {
        _logger = logger;
    }

    public void SomeMethod()
    {
        _logger?.LogDebug("SomeMethod invoked");
    }
}

在这两种方法中,ILogger<T>的传递方式都是非常相似的,但是否有任何理由支持ILogger<T>?默认为null,而不是两个ctors --一个默认为NullLogger<T>,并确保_logger从不为null或反之亦然?

表现有什么不同吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-04 23:53:21

正如一条评论所指出的,性能和对象分配的tearms差别很小,因此我实际上避免在性能tearms中比较这两种方法。

相反,我建议考虑以下几点:

在设计上,

  • 有两个构造函数是最差的。这将使创建对象更加困难,因为对象创建者必须在两者之间进行选择,并且必须理解不同的语义。只有一种方法来创建对象要好得多:这更简单,而且应该如何创建对象,

  • ,尽可能避免处理null值,这是没有歧义的。使用可能是null的对象的代码很难维护,因为如果您在重构代码时意外地忘记了?操作符,您将在运行时得到一个NullReferenceException。您需要为null用例编写和维护额外的单元测试,以确保代码中的某个地方没有忘记?

基于这两点,更好的设计如下:

constructor

  • do有一个只有一个的类,它不允许_logger字段为空,也就是说它的类型应该是ILogger<Person>而不是ILogger<Person>?。在不关心日志记录的情况下,使用空对象模式并在构造函数中注入NullLogger<Person>实例(而不是使用null引用)。

最后一点,不要实例化NullLogger<T>。相反,使用NullLogger.Instance静态字段。通过这样做,您将访问该类的共享缓存实例,并避免分配新对象(对于像NullLogger<T>这样的无状态类来说,这样做很好)。这在内存使用和垃圾收集器压力的tearms中很好。

该课程的最终设计如下:

代码语言:javascript
复制
public class Person
{
    private readonly ILogger<Person> _logger;

    public Person(ILogger<Person> logger)
    {
        // guard against null
        _logger = logger ?? throw new ArgumentNullException(nameof(logger));
    }

    public void SomeMethod()
    {
        _logger.LogDebug("SomeMethod invoked");
    }
}

// if you don't care about logging
var person = new Person(NullLogger<Person>.Instance);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72501862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档