在 C# 10.0 中启用了可为空的仅初始化引用属性
Init-only reference properties with nullable enabled in C# 10.0
我尝试使用仅初始化属性来强制客户端代码在创建 class 时初始化它,但没有构造函数。它没有按我的计划工作。
这里是 class,精简以说明这一点。
public class Target
{
public int Id { get; init; }
public string Name { get; init; }
}
该项目基于 .NET 6.0,因此我使用的是 C# 10.0。 Nullable 在项目中设置为“已启用”,因此引用 属性 Name
必须 为非空。令我困惑的是,编译器抱怨 constructor.
之后的 Name 属性 可能为空
CS8618: Non-nullable property 'Name' must contain a non-null value when exiting constructor
这当然是真的,但是使用仅初始化 属性 的全部意义在于我不 想要 构造函数。我想强迫人们使用 init-only 属性将 Name
初始化为有效的东西。如果我想写一个构造函数,我可以只写一个只读的 属性.
(我意识到我可以将 Name
默认为 string.Empty
或我自己的一些其他有效值,但我想强制编码员这样做)
C# 10.0 是否提供了一种方法来实现我想要的而无需执行以下任何操作?
- 默认引用 属性 某些非空值(通过构造函数或通过内联初始化程序)
- 将 属性 声明为可为 null
- 完全禁用可为空
- 使用
record
类型而不是 class (因为我想要成员函数)
这可行吗?
我对这个主题的搜索让我找到了 this post,但我能从中得到的最好结果是 link 到 Mads Torgensen 的博客,讨论他们计划在 C# 10 中做什么。是否有有更新吗?
init
属性不会 force 要初始化的值,只有构造函数会这样做。 init
的作用是,如果要初始化属性,必须在构造时完成对象初始值设定项(或在构造函数中,如果有的话):它不保证它会。
如果你想在这里获得最大的稳健性,请改为通过构造函数初始化它们,这允许你添加保护子句并保证不可为 null 的属性。
这就是你想要的(我也是):
This proposal adds a way of specifying that a property or field is required to be set during object initialization, forcing the instance creator to provide an initial value for the member in an object initializer at the creation site.
我尝试使用仅初始化属性来强制客户端代码在创建 class 时初始化它,但没有构造函数。它没有按我的计划工作。
这里是 class,精简以说明这一点。
public class Target
{
public int Id { get; init; }
public string Name { get; init; }
}
该项目基于 .NET 6.0,因此我使用的是 C# 10.0。 Nullable 在项目中设置为“已启用”,因此引用 属性 Name
必须 为非空。令我困惑的是,编译器抱怨 constructor.
CS8618: Non-nullable property 'Name' must contain a non-null value when exiting constructor
这当然是真的,但是使用仅初始化 属性 的全部意义在于我不 想要 构造函数。我想强迫人们使用 init-only 属性将 Name
初始化为有效的东西。如果我想写一个构造函数,我可以只写一个只读的 属性.
(我意识到我可以将 Name
默认为 string.Empty
或我自己的一些其他有效值,但我想强制编码员这样做)
C# 10.0 是否提供了一种方法来实现我想要的而无需执行以下任何操作?
- 默认引用 属性 某些非空值(通过构造函数或通过内联初始化程序)
- 将 属性 声明为可为 null
- 完全禁用可为空
- 使用
record
类型而不是 class (因为我想要成员函数)
这可行吗?
我对这个主题的搜索让我找到了 this post,但我能从中得到的最好结果是 link 到 Mads Torgensen 的博客,讨论他们计划在 C# 10 中做什么。是否有有更新吗?
init
属性不会 force 要初始化的值,只有构造函数会这样做。 init
的作用是,如果要初始化属性,必须在构造时完成对象初始值设定项(或在构造函数中,如果有的话):它不保证它会。
如果你想在这里获得最大的稳健性,请改为通过构造函数初始化它们,这允许你添加保护子句并保证不可为 null 的属性。
这就是你想要的(我也是):
This proposal adds a way of specifying that a property or field is required to be set during object initialization, forcing the instance creator to provide an initial value for the member in an object initializer at the creation site.