自从.net 2.0中引入这个概念以来,我一直在寻找关于这方面的一些好的指导。
为什么我要在c#中使用不可为空的数据类型?(一个更好的问题是,为什么我在默认情况下不选择可空类型,而只在显式有意义的情况下才使用不可空类型。)
选择一个可以为空的数据类型而不是它的不可为空的对等体是否会对性能造成“显著”的影响?
我更喜欢根据null而不是Guid.empty、string.empty、DateTime.MinValue、<= 0等检查我的值,并且通常使用可以为空的类型。我没有更多地选择可空类型的唯一原因是我后脑勺的刺痛感,这让我觉得不仅仅是向后兼容,这迫使额外的'?‘字符显式允许空值。
有没有人总是(大多数总是)选择可空类型而不是不可空类型?
耽误您时间,实在对不起,
发布于 2009-05-06 17:15:59
你不应该总是使用可空类型的原因是,有时你能够保证一个值将被初始化。并且您应该尝试设计您的代码,以使这种情况尽可能多地出现。如果一个值不可能被取消初始化,那么就没有理由认为null应该是它的合法值。作为一个非常简单的示例,请考虑以下内容:
List<int> list = new List<int>()
int c = list.Count;这始终是有效的。没有一种可能的方法可以取消初始化c。如果它被转换成一个int?,你将有效地告诉读者代码“这个值可能是空的。在使用它之前一定要检查一下”。但是我们知道这永远不会发生,所以为什么不在代码中公开这个保证呢?
在值是可选的情况下,您是绝对正确的。如果我们有一个函数可以返回字符串,也可以不返回字符串,则返回null。不要返回string.Empty()。不要返回“魔术值”。
但并非所有值都是可选的。将所有内容都设置为可选会使其余代码变得更加复杂(它会添加另一个必须处理的代码路径)。
如果您可以明确保证此值始终有效,那么为什么要丢弃此信息呢?这就是通过将其设置为可空类型来实现的。现在,该值可能存在,也可能不存在,任何使用该值的人都必须处理这两种情况。但你知道,这些情况中只有一种是可能的。因此,请帮助您的代码用户,并在您的代码中反映这一事实。然后,代码的任何用户都可以依赖于该值是有效的,并且他们只需处理一种情况,而不是两种情况。
发布于 2009-05-06 16:56:33
因为总是要检查可为空的类型是否为null是不方便的。
显然,在某些情况下,值确实是可选的,在这些情况下,使用可空类型而不是魔术数字等是有意义的,但在可能的情况下,我会尽量避免使用它们。
// nice and simple, this will always work
int a = myInt;
// compiler won't let you do this
int b = myNullableInt;
// compiler allows these, but causes runtime error if myNullableInt is null
int c = (int)myNullableInt;
int d = myNullableInt.Value;
// instead you need to do something like these, cumbersome and less readable
int e = myNullableInt ?? defaultValue;
int f = myNullableInt.HasValue ? myNullableInt : GetValueFromSomewhere();发布于 2009-05-06 16:57:06
我认为语言设计者认为“引用类型在缺省情况下可以为空”是一个错误,并且不可为空是唯一合理的缺省值,您应该选择为空。(在许多现代函数式语言中都是这样。)"null“通常是一堆麻烦。
https://stackoverflow.com/questions/830592
复制相似问题