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

问题描述 投票:0回答:1

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

这是此类的一个示例:

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

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

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

我已经尝试过两种解决方案,但它们不太适合我:

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

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

编辑:修复问题的格式

c# null
1个回答
0
投票

不太确定您到底想在这里实现什么目标......

如果您只想消失警告,可以这样做:

[NotNull]
private MyReference? _reference;

您将不再看到错误,当您将其标记为可为空时,您承诺它永远不会为空。这意味着如果你要做这样的事情:

If (_reference == null)
它会告诉你,由于你的承诺,它总是假的。

如果您想确保在使用该类之前调用

Activate()
,请考虑使用 get 方法。

public MyReference GetReference()
{
    return _reference is null ? Activate() : _reference;
}

这里我假设

Activate()
返回创建的值,但在您的示例中并非如此,您可以更改它,或者让 getter 在调用
Activate()

后返回变量
© www.soinside.com 2019 - 2024. All rights reserved.