0

我从MSDN看到了以下代码:

using System;

public sealed class Foo : IDisposable
{
    private readonly IDisposable _bar;

    public Foo()
    {
        _bar = new Bar();
    }

    public void Dispose()
    {
        _bar?.Dispose();
    }
}

我不明白为什么它需要使用_bar?.Dispose();而不是_bar.Dispose();

_bar已经readonly在构造函数中声明并初始化了,所以_bar不会为null,也不能重新赋值给null,那为什么还要对null做检查_bar呢?

4

2 回答 2

4

在这种特定情况下,它是多余的。但是,稍微复杂一点的构造函数可能允许在调用构造函数之前this转义1Bar,当然Bar构造函数可以然后throw,使该字段未分配。

如果Dispose要在这个部分构造的对象上调用Foo,那就是null. 这有点做作,但是,再一次,你不应该只是字面上有一个Foo只包装 aBar并且什么都不做的类。


1你做的也不是很理想,但这样做是有效的,不管它可能是错误的判断。是必需的,以便能够调用Dispose实例上的方法。

于 2021-09-15T09:45:48.937 回答
0

这只是为了更简洁的代码。只需在所有 Dispose() 中进行空检查。

但从技术上讲,是的,实际上这不是一个要求。

于 2021-09-15T09:35:28.713 回答