C# 为空对象提供方法返回值是否有用?

C# 为空对象提供方法返回值是否有用?,c#,java,C#,Java,能够为空对象提供方法返回值是否有用 对于列表,空返回值可能是: get(int) : null size() : 0 iterator() : empty iterator 这将允许以下代码具有较少的空检查 List items = null; if(something) { items = ... } for(int index = 0; index < items.size(); index++) { Object obj = items.get(index);

能够为空对象提供方法返回值是否有用

对于列表,空返回值可能是:

get(int) : null
size() : 0
iterator() : empty iterator
这将允许以下代码具有较少的空检查

List items = null;

if(something) {
    items = ...
}

for(int index = 0; index < items.size(); index++) {
    Object obj = items.get(index);
}
列表项=null;
如果(某物){
项目=。。。
}
对于(int index=0;index
只有当类或接口定义了它并且空检查仍然有效时,才会使用它。有时,您不希望执行空检查,因此将其作为一个选项似乎是有益的


发件人:

这是个好主意。

Smalltalk就是这么做的

有一个空对象。它不是从物体上降下来的。(Smalltalk是一个类似Java的单根类层次结构)


对于高级学生,您可以将其细分为制作代理的子类

这是个好主意。

Smalltalk就是这么做的

有一个空对象。它不是从物体上降下来的。(Smalltalk是一个类似Java的单根类层次结构)


对于高级学生,您可以将其细分为制作代理的子类

这是一种称为空对象的模式


这是一种称为空对象的模式

Ruby做到了这一点(以及其他方面)。它具有nil而不是null,并且是一个对象

我讨厌返回列表的函数可以返回null。最好返回一个空列表,让用户决定是否要检查null(空)。

Ruby会这样做(以及其他操作)。它具有nil而不是null,并且是一个对象


我讨厌返回列表的函数可以返回null。最好返回一个空列表,让用户决定是否要检查null(empty)。

不必检查null很好,有些语言使它变得更容易——例如C#的不可空类型,或者Haskell,它没有null,但可以用Maybe类型构造函数表示缺少的值

空列表与空列表不同。您可以认为,有人在需要列表的地方传入NULL,这是在犯编程错误,正确的做法是抛出一个NullPointerException


接受空值的典型借口是,通常情况下,您不需要列表,并且不必创建一个空的新列表,尤其是在考虑效率的情况下。您可以在不更改语言的情况下获得许多好处,但可以使用静态空列表,人们可以传入该空列表,而无需重新初始化。

不必检查空值,这很好,一些语言使其变得更容易,例如C#的不可空类型,或者Haskell,它没有空值,但可以用Maybe类型构造函数表示缺少的值

空列表与空列表不同。您可以认为,有人在需要列表的地方传入NULL,这是在犯编程错误,正确的做法是抛出一个NullPointerException

接受空值的典型借口是,通常情况下,您不需要列表,并且不必创建一个空的新列表,尤其是在考虑效率的情况下。您可以在不更改语言的情况下获得许多好处,但可以使用静态空列表,人们可以将其传递进来,而不需要重新初始化。

在C#(以及其他语言)中,这通常是不允许的。如果没有Foo的实例,.net不知道调用Foo的方法或Foo的子方法

但是,应用于Foo类型的C#3.0扩展方法将允许:

Foo x = null;
if (x.Bar() == 0)
{
  Console.WriteLine("I win");
}
钢筋可以这样建造:

public static int Bar (this Foo theFoo)
{
  return theFoo == null ? 0 : 1;
}
在C#(以及其他语言)中,这通常是不允许的。如果没有Foo的实例,.net不知道调用Foo的方法或Foo的子方法

但是,应用于Foo类型的C#3.0扩展方法将允许:

Foo x = null;
if (x.Bar() == 0)
{
  Console.WriteLine("I win");
}
钢筋可以这样建造:

public static int Bar (this Foo theFoo)
{
  return theFoo == null ? 0 : 1;
}

这有点不同,因为它将决策从生成类型的所有代码移动到声明类型的代码。这有点不同,因为它将决策从生成类型的所有代码移动到声明类型的代码。这很好。因为nil是一个对象,所以很容易实现null模式。只需将该方法置于nil对象上即可。:-)什么是好的。因为nil是一个对象,所以很容易实现null模式。只需将该方法置于nil对象上即可。:-)斯蒂芬·科尔伯恩的相关想法:斯蒂芬·科尔伯恩的相关想法: