使用方法而不是构造函数初始化非 null 属性

Initialize non-null properties using a method instead of constructor

提问人:Sander van 't Einde 提问时间:8/28/2023 更新时间:8/28/2023 访问量:58

问:

在我们的架构中,我们有一个方法,它总是在调用任何其他方法之前被调用。此方法用于初始化构造对象时不可用的引用。

下面是此类的示例:

#nullable enable
public class MyClass
{
    private MyReference _reference; // this shows a warning
    
    public MyClass() { } 

    public void Activate()
    {
        _reference = new MyReference();
    }
}

现在我在私有字段上收到警告,因为它没有在构造函数中初始化(这是有道理的)。

我已经尝试过 2 种解决方案,它们并不完全适合我:

  1. 使该字段可为空。但是,这意味着在我尝试访问该字段的任何地方,我都必须进行空检查
  2. 如代码示例所示,将 中初始化的所有字段标记为 。这将删除错误,但是我们不会在任何地方强制执行实际初始化。Activate= null!

我的问题是:是否有任何属性或方法可以使此示例工作,当我的类字段的初始化发生在构造函数之外时,我得到了强制初始化(通过编译器警告)

编辑:修复问题的格式

C# null

评论

0赞 Sweeper 8/28/2023
调用构造函数怎么样?如果你这样做,会有所帮助。ActivateMemberNotNullAttribute
0赞 Klaus Gütter 8/28/2023
编译器只能处理它所知道的构造,这些是构造函数和对象初始值设定项。您的方法没有什么特别之处,因此编译器无法确保在调用它之前调用它。Activate
1赞 Fildor 8/28/2023
我从中读到的是,该对象已创建,但直到以后才完全初始化。那么构建器模式有用吗?这样一来,您甚至可以清楚地区分完全初始化的对象和中间状态。
0赞 Sander van 't Einde 8/28/2023
@Fildor我同意,这可能是一个好方法。但是,由于这是我们框架的一部分,因此我们必须为每个类添加它。这可能会导致相当冗长的代码。@Sweeper 这个想法是,这由我们的框架处理,并且对象的初始化发生在调用 .Activate
0赞 Sander van 't Einde 8/28/2023
@KlausGütter我同意你的说法,正如在问题中所说,我也确定情况确实如此。但是,看看其他框架,例如,我们有Unity,它做了类似的事情,其中Unity定义了一个生命周期,你必须在该框架中遵守。这是类似的情况

答: 暂无答案