Ear*_*rlz 20 language-agnostic null language-design non-nullable
我曾经读过,拥有可空类型是一种绝对的邪恶.我相信这是由创建它们的人写的一篇文章(在Ada中?)我相信这是文章
无论如何,那么如果默认情况下像C#这样的语言使用非可空类型呢?你会如何替换C#或Ruby中的一些常用习语或任何其他null可接受值的常用语言?
Ric*_*erg 26
我认为,大多数语言都将可空性嫁接到各种类型上,而这两种概念应该是正交的,而不是直接宣称可以为空的类型是邪恶的.
例如,所有非原始Java类型(以及所有C#引用类型)都可以为空.为什么?我们可以来回走动,但最终我敢打赌答案归结为"很容易".Java语言没有任何内在要求广泛的可空性.C++参考提供了一个很好的例子,说明如何在编译器级别驱除空值.当然,C++有一些非常丑陋的语法,而Java明确地试图缩减它,所以一些好的功能最终会出现在切割底线上.
C#2.0中的可空值类型向正确的方向迈出了一步 - 将可空性与无关类型语义分离,或者更糟糕的是,CLR实现细节 - 但它仍然缺少与引用类型相反的方法.(代码合同很棒,但它们并没有像我们在这里讨论的那样嵌入到类型系统中.)
大量功能性或其他模糊语言从一开始就使这些概念"直接"......但如果它们被广泛使用,我们就不会进行这种讨论......
要回答你的问题:禁止现代语言中的空白批发,就像所谓的"十亿美元错误"一样愚蠢.有一些有效的编程结构,其中空值很好:可选参数,任何类型的默认/回退计算,其中coalesce运算符导致简洁代码,与关系数据库的交互等.强制自己使用sentinel值,NaN等将是比疾病更糟糕的"治愈".
也就是说,我暂时会同意引文中表达的观点,只要我可以详细说明以适合我自己的经验:
bca*_*cat 23
我们在(非常)少数地方使用选项类型,其中允许实际需要空值,并且我们有更少的模糊错误,因为任何对象引用都将保证指向适当类型的有效实例.
Haskell是一种强大的语言,没有无效的概念.基本上,每个变量必须初始化为非空值.如果要表示"可选"变量(变量可能有值但可能没有),则可以使用特殊的"Maybe"类型.
在Haskell中实现这个系统比在C#中更容易,因为数据在Haskell中是不可变的,因此拥有一个稍后填充的空引用并没有多大意义.但是,在C#中,链接列表中的最后一个链接可能具有指向下一个链接的空指针,该链接在列表展开时填充.我不知道没有null类型的过程语言会是什么样子.
此外,请注意上面的许多人似乎建议用特定于类型的逻辑"无"值(999-999-9999," NULL "等)替换空值.这些值并没有真正解决任何问题,因为人们对空值的问题在于它们是一种特殊情况,但人们忘记了为特殊情况编码.对于特定于类型的逻辑无关值,人们仍然忘记为特殊情况编写代码,但他们避免了捕获此错误的错误,这是一件坏事.