将null传递给可接受的方法

Null对我来说是一种奇怪的数据类型,似乎它曾经是错误的使用,也许它的空指针错误我经常作为一个初学者,现在让我将任何null实例与某种邪恶联系起来!

无论如何我的问题是

在某些情况下,可以使用null作为参数吗? 例如,一个方法可能需要a和b来完成一项任务,但在某些情况下它可能只需要一个。 在那些奇怪的实例中为b解析为null,并检查是否(b == null)然后我们知道它叫什么?

还是我在这里的标志?

我必须承认,让我想知道这是否可以接受的是,所讨论的方法可以重叠,但是整个方法可能会有5或6行的差异。 这让我担心代码重复。

null传递给方法绝对没问题。 但是,如果您有可能不需要传递变量的csae,请考虑重载 。

您可能传递null的原因是因为您可能有一个方法具有相当多的参数,并且您不想实现所有可能的重载。

我个人不会使用可选参数 – 由于该方法作为合同的问题超出了本问题的范围,因此对此主题进行了许多讨论。


UPDATE

正确的方法不是重复代码,而是让重载相互调用:

 public void Foo(A a) { Foo(a, null); } public void Foo(A a, B b) { // ....... } 

这将告诉客户端此代码:

  • 您只能使用A调用方法
  • 您可以使用A和B调用方法

如果我只有第二种方法, 客户端将不知道是否可以传递null

我认为这不行。 传递null绝不是一个好习惯,在我看来,只要值为null,它就应该是一个例外。 您可能无法始终控制数据的传递方式,在这种情况下,您应检查是否为空以防万一。 但是,如果您可以选择自己控制参数,则应该重载方法,而不是传入null。

请考虑以下情形:

 public string DoSomething(string a, string b) { // Returns something after a and b is processed. } 

在这个例子中,我们指出a和b是字符串。 它们是char []类型的对象,或者您想要定义一个字符串。 在这个方法中传入null根本就没有意义,因为我们期待字符串。 null不算什么 – 它不是一个空字符串 – 它只是无效。

我之所以说我不认为将null发送到方法中是因为从来没有任何null用途。 它只是一个空白留在那里作为一个未能实现的东西的占位符。 因此,调用上面的方法是这样的:

DoSomething(“无论如何”,null)毫无意义。

我们可以争辩说我们可以这样做:

 ///  /// Does something with string a or b ///  /// The first string. If it's null, nothing is done with it /// The second string. If it's null, nothing is done with it ///  public string DoSomething(string a, string b) { // Returns something after a and b is processed. } 

但这也使代码的可读性降低。 为什么不进行重载DoSomething(字符串a)? 或者可能完全重构该方法,因为它可以使用anull执行某些操作并仍然返回有效值。 null不是有效值,因此包含null作为参数的操作的结果不应返回有效值。

这就像在数学中使用无穷大一样。 如果你用它加/减,乘或除它,你总会得到无穷大。

放弃

这些是我自己的观点,绝不是“正确”的编程方式。 但由于这个问题没有正确的答案,我将练习言论自由的权利:)

如果不使用某些参数,可以在C#4.0中使用重载或可选参数

你是说“将null作为参数传递给方法是否可以?”

如果是的话 – 是的 – 这是完全可以接受的。

但是,在.Net 4.0世界中,您可能需要考虑使用可选参数,这样您甚至不需要传入null,您可以省略它。

在.Net 4.0之前的世界中,如果将此null传递给方法是一种常见方案,则可能需要创建一个根本不接受参数的重载。

这是完全可以接受的。 如果您使用的是C#4.0,则还可以使该参数成为可选参数,以便调用者不需要指定默认值。