【发布时间】:2020-04-12 22:24:00
【问题描述】:
我有一个 DTO,它是通过从 DynamoDB 表中读取来填充的。假设它目前看起来像这样:
public class Item
{
public string Id { get; set; } // PK so technically cannot be null
public string Name { get; set; } // validation to prevent nulls but this doesn't stop database hacks
public string Description { get; set; } // can be null
}
是否有任何最佳实践来解决这个问题?我宁愿避免使用非无参数构造函数,因为这与 Dynamo SDK(以及其他)中的 ORM 很不符。
写public string Id { get; set; } = ""; 对我来说似乎很奇怪,因为这将永远发生,因为Id 是一个PK 并且永远不能为空。 "" 有什么用呢?
那么有什么最佳实践吗?
- 我是否应该将它们全部标记为
string?以表示它们可以为空,即使有些永远不应该是。 - 我是否应该用
""初始化Id和Name,因为它们应该永远不会为空,这表明了意图,即使永远不会使用""。 - 以上的一些组合
请注意:这是关于 C#8 nullable reference types 如果您不知道最好不要回答。
【问题讨论】:
-
除了
= "",您可以使用= null!来初始化您知道永远不会有效地为null的属性(当编译器无法知道时)。如果Description可以合法地为null,则应将其声明为string?。或者,如果对 DTO 的可空性检查比帮助更麻烦,您可以简单地将类型包装在#nullable disable/#nullable restore以仅关闭此类型的 NRT。 -
@JeroenMostert 你应该把它作为答案。
-
@Magnus:我不愿意回答任何询问“最佳实践”的问题;这样的事情是广泛的和主观的。我希望 OP 可以使用我的评论来制定自己的“最佳实践”。
-
@IvanGarcíaTopete:虽然我同意将字符串用作主键是不寻常的,甚至根据具体情况可能是不可取的,但 OP 的数据类型选择与问题无关。这可以很容易地应用于不是主键的必需的、不可为空的字符串属性,甚至是作为复合主键一部分的字符串字段,问题仍然存在。
-
@MassDotNet 可为空的引用类型不会阻止分配引用
null。它们仍然是可以具有空值的引用类型。它所做的只是添加编译器警告,让您知道您可能在预期非空值的地方使用空值。但应该注意的是,反序列化代码可能会考虑类型并拒绝空值,而如果关闭可空引用类型则不会。
标签: c# c#-8.0 non-nullable nullable-reference-types