可空引用类型和 MSTest ClassInitialize

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

MSTest 提供了一个

[ClassInitialize]
属性,可以将其放置在
static
方法上以提供一次性初始化。

假设我在测试类中有一个静态成员,我希望在这样的

[ClassInitialize]
方法中初始化它。我如何标记它不可为空?

例如,考虑以下代码:

private static Database _database;

[ClassInitialize]
public static void InitializeClass(TestContext testContext)
{
    _database = new Database();
}

使用

#nullable enable
,我得到一个非常容易理解的警告:CS8618
Non-nullable field '_database' must contain a non-null value when exiting constructor. Consider declaring the field as nullable.

我可以将初始化移至构造函数(但每个测试方法都会发生这种情况)。我可以使用 null-forgiving 运算符 (

!
)。是否有更好的选项来标记
_database
不为空?

c# mstest nullable-reference-types
2个回答
5
投票

在这种情况下我更喜欢使用空宽恕。具体来说,您可以只设置您知道将填充的属性,但编译器无法使用

null!
进行选择。

例如:

private static Database _database = null!;

0
投票

我真的不喜欢

= null!;
语法,而且我也无法真正找出原因。这看起来很丑陋,而且确实没有必要。我不想更新数百个测试。

无论如何,我这样做了(在 Visual Studio 中):

  1. 右键单击测试项目> 属性
  2. 在顶部,搜索“抑制”属性。
  3. 将 CS8618 添加到列表中,并用分号分隔。
  4. 点击保存。

我只打算在测试项目中这样做。有时我需要在测试设置中使用异步代码,因此我无法在构造函数中初始化这些成员。 (构造函数不能是异步的。)

© www.soinside.com 2019 - 2024. All rights reserved.