C# 如何表示可能未设置的数据

C# 如何表示可能未设置的数据,c#,nullable,data-representation,C#,Nullable,Data Representation,我有一个包含许多属性的类,比如: public class Update { public int Quantity { get; set; } public decimal Price { get; set; } public string Name { get; set; } } Update的每个实例不一定都有每个属性集,系统的另一部分需要知道哪些属性已设置,哪些属性未设置 我有一个选择,就是使所有的值类型都可以为null,因此null值表示不被设置的概念。虽然这

我有一个包含许多属性的类,比如:

public class Update
{
    public int Quantity { get; set; }
    public decimal Price { get; set; }
    public string Name { get; set; }
}
Update
的每个实例不一定都有每个属性集,系统的另一部分需要知道哪些属性已设置,哪些属性未设置

我有一个选择,就是使所有的值类型
都可以为null
,因此
null
值表示不被设置的概念。虽然这会起作用,但我并不真正喜欢让一些属性显式地
可为null
(值类型)和一些由于是引用类型而可为null的想法。类定义看起来很难看,我不相信空检查在语义上是最好的方法

我可以创建一个非常类似于
Nullable
的类,它对
T
没有约束,并具有
IsSet
属性。与使用
Nullable
相比,我更喜欢此选项,但我还是想看看是否有人有比我建议的选项更好的替代表示法。

引用类型已经可以有效地为null-如果使用
int?
decimal?
string
则您的每个属性都可以为空

如果要将
字符串
值设置为null引用,则会出现问题-如果null实际上是已设置的有效值


你当然可以写一个
或者
类型,但我不确定我会写-我可能只会使用null。。。除此之外,对于那些习惯于C#习惯用法的阅读代码的人来说,这会更为熟悉。对于所有的“反空”情绪(我在很多情况下都有同感),在某些情况下,这是最简单的方法。

你真的应该坚持这里已经存在的习惯用法。使用内置的可空性

我看到您对value和ref类型的可空性的关注有所不同。你的变通办法会奏效的。但这只是一个表面上的改变,对你没有什么好处。在这种情况下,我建议您更改自己,而不是更改代码。尽量使自己适应现有的惯例

编辑:有时您需要能够在泛型代码中使值成为可选值。在这种情况下,您需要使用一些自定义选项类型。根据经验,我可以告诉你,这是非常恶劣的使用。这不是我选择的解决方案

我真的不喜欢某些属性可以为null的想法 值类型)和一些非(引用类型)

引用类型显然是可以为空的

string t = null; //is totally valid

我想说,Nullable正是您想要用于此目的的东西。
您可以使用属性包装成员(就像您已经做的那样),让类在需要时向外部显示正常值以及“IsItSet”方法。但在内部,我会使用Nullable。

来向您推荐一些新东西。。。如果你只是谈论一个像Update这样成员数量有限的类,我只会使用IsSet

但是,如果您有很多类似的类具有这种行为,或者有很多属性,我建议您使用t4模板。在示例中,您可以按描述获取类属性(所需的类型或属性),并根据属性列表自动生成代码(自动实现所需的任何设计)

如果有人感兴趣的话,我可以更详细地描述…

这里的解决方案

  • 如果null不是有效选项,请使用nullable
  • 如果null是有效选项,请使用默认值,但您完全可以确定给定值不会出现
  • 为每个属性使用布尔标志,其中null是有效值,并且不能命名永远不会使用的默认值
示例: 数量应该可以为null,因为如果设置了它,它的值永远不会为null

如果名称可能为空(缺少名称),并且您确信名称永远不会为空,则名称应默认为“”

一个标志,比如说,如果名称可能有一个空值,而您想不出一个默认值,那么应该使用名称集。默认情况下,此标志为false,当您首次设置Name的值时,该标志也应设置为true


如果希望以相同的方式处理所有属性,解决方案是创建一个包含对象和布尔标志的类。对象将存储属性的值,标志将存储属性是否已初始化,但我不喜欢这样,因为即使不需要它,它也会创建布尔标志。

为什么要重新发明轮子
Nullable
是这里最好的方法。是的,确实如此,这就是为什么我不特别喜欢“重载”null的概念来表示“未设置”@RichK:那么你需要null作为有效的设置值吗?如果没有,阻止它被设置,你就可以开始了。可能没有。。。这似乎很重要implausable@usr谢谢不过,我从来都不喜欢在不探索替代方案的情况下适应现有的惯例:)