题
我设计的语言,而且我想知道它是否合理,使参照类型非空默认情况下,使用"?"对可能为空值和参考类型。是否有任何问题吗?你会怎么做这个:
class Foo {
Bar? b;
Bar b2;
Foo() {
b.DoSomething(); //valid, but will cause exception
b2.DoSomething(); //?
}
}
解决方案
我目前的语言的设计理念是,空性应该是一个程序是强制要求,没有给上默认基准种类(在此,我同意托尼*霍尔-谷歌他最近的大会谈)。
在这个具体例子,与unnullable b2,它甚至不会通过的静态检查:保守的分析不能保证b2没空,所以程序不是语义上有意义的。
我的理念是很简单的。引用一个间接处理到一些资源,我们可以遍获得对该资源。Nullable引用 要么 间接处理到资源, 或 通知的资源不可,一个是永远不会肯定了前面哪些语义正在使用。这给任何一个众多的检查的前面(这是空?没有?耶!), 或者不可避免的展会上(或者当量)。大多数方案拟订资源,这些天来,没有大量的资源有限的或结到一些有限的基本模型的空引用的是,简单地,其中一个...
- 懒惰:"我就蓬空在这里"。它坦率地说,我没有太多的同情
- 混乱:"我不知道该怎么放在这里"。通常还有一个遗留下来的老的语言,在这里您不得不宣布您的资源名称之前你知道什么资源。
- 错误:"这就是错误的,这里有一个NULL"。更好的错误报告机制,因此必须在一种语言
- 一个洞:"我知道我会有的东西很快,给我占位".这具有更多优点,我们可以想办法打击这一点。
当然,解决每个情况下,空电流提供一个更好的语言的选择是不小的壮举,可能会添加更多的混淆,它帮助。我们总是可以去不可改变的资源,因此空中的这只有用的国家(错误,并孔)没有多少实际使用。必须technqiues将留在这里虽然我坦率地说,很高兴-这就使寻找更好的解决方案,在这个空间是值得的。
其他提示
具有引用类型是非空的默认是唯一合理的选择。我们对语言和搞砸这件事困扰的运行时间;你应该做的正确的事情。
这个特点是在规格#。他们默认可空引用和使用!指示非nullables。这是因为他们想要的向后兼容性。
在我的梦里语言(其中我可能是唯一的用户!)我会做同样的选择,因为你,不可为空默认情况下。
我也将使其非法使用。运营商可为空引用(或其他任何将取消对它的引用)。你将如何使用他们?你必须先将他们转换为非nullables。你会怎么做呢?通过检测其空。
在Java和C#中,if
语句只能接受一个bool
测试表达式。我延伸它接受一个可空参考变量的名称:
if (myObj)
{
// in this scope, myObj is non-nullable, so can be used
}
此特殊语法将不足为奇到C / C ++程序员。我喜欢这样的特殊语法,使之清楚,我们正在做一个检查修改真相分支内的名称myObj
的类型。
我添加糖的另一种位:
if (SomeMethodReturningANullable() into anotherObj)
{
// anotherObj is non-nullable, so can be used
}
这只是给出的名称anotherObj
对into
左边的表达式的结果,因此它可以在它是有效的范围内使用。
我会做这样的事情了?:
操作。
string message = GetMessage() into m ? m : "No message available";
请注意string message
是不可为空的,而且还有上述试验的两种可能的结果,因此,分配是值。
和然后也许用于空代的值的推测常见的情况有点糖:
string message = GetMessage() or "No message available";
显然or
只会被有效地施加到左侧的空类型,并且在右侧的非空值。
(I也就会有一个内置的实例字段所有权的概念;编译器会自动生成IDisposable.Dispose
方法和~Destructor
语法将被用于增加Dispose
,正如在C ++ / CLI)
规格#不得不涉及非nullables另一个句法扩展,由于确保非nullables已建造期间正确初始化该问题:
class SpecSharpExampleClass
{
private string! _nonNullableExampleField;
public SpecSharpExampleClass(string s)
: _nonNullableExampleField(s)
{
}
}
在换句话说,你必须以同样的方式来初始化字段,你会调用其他的构造与base
或this
- 当然,除非你旁边初始化它们的字段声明
有一个在所述 Elvis操作符为Java 7.>建议此有类似的功能,因为它封装在一个运营商空校验和方法调度,以指定的返回值,如果对象为null。因此:
String s = mayBeNull?.toString() ?: "null";
检查字符串s为空,并返回字符串“null”如果是的话,和该字符串的值如果不是。食粮,也许。
具有空性是一个配置设置,可强制执行的在作者来源代码。这样,你就可以让谁喜欢默认为空的对象人在他们的源代码享受他们,同时让那些希望他们的所有对象是默认非空的谁拥有这一点。此外,提供关键字或其他设施的明确标志,它的对象和类型的声明可以为空的,哪些不能,喜欢的东西nullable
和not-nullable
,覆盖全球的默认值。
例如
/// "translation unit 1"
#set nullable
{ /// Scope of default override, making all declarations within the scope nullable implicitly
Bar bar; /// Can be null
non-null Foo foo; /// Overriden, cannot be null
nullable FooBar foobar; /// Overriden, can be null, even without the scope definition above
}
/// Same style for opposite
/// ...
/// Top-bottom, until reset by scoped-setting or simply reset to another value
#set nullable;
/// Nullable types implicitly
#clear nullable;
/// Can also use '#set nullable = false' or '#set not-nullable = true'. Ugly, but human mind is a very original, mhm, thing.
很多人认为,让每个人都有自己想要的东西是不可能的,但如果你正在设计一个新的语言,尝试新事物。东尼·霍尔介绍null
的概念在1965年,因为他无法抗拒(他自己的话说),从那时起(也,他自己的话说,这名男子是遗憾的话),我们为它付出代价。重点是,聪明,有经验的人会犯错误,成本我们的休息,不要采取任何人的意见这个网页上,好像它是唯一的真理,包括我。评估和考虑一下。
我读过它是如何我们这些可怜的经验的程序员谁真的不明白的地方,真正使用null
哪里不,我们展示模式和反模式即是为了防止在拍摄自己的脚很多很多的咆哮。在这期间,数以百万计仍缺乏经验的程序员的语言,让null
产生更多的代码。 我可能是缺乏经验,但我知道我的哪个对象的不被可空受益。
我认为空值是好的:他们是你做错了什么的明确指示。如果你没有什么地方初始化一个参考,你会得到即时通知。
另一种方法是通过将值有时初始化为默认值。逻辑错误是那么很多更难以察觉,除非你把检测逻辑这些默认值。这将是相同刚开一个空指针异常。