为什么没有参数没有IsNullOrEmpty重载方法?

当试图弄清楚字符串是空还是空时,我通常已经有了字符串。 这就是为什么我希望像String.IsNullOrEmpty()这样的实用函数能够在没有参数的情况下工作:

String myString; bool test=myString.IsNullOrEmpty(); 

但是,这不起作用,因为IsNullOrEmpty需要String参数。 相反,我必须写:

 String myString; bool test=String.IsNullOrEmpty(myString); 

为什么会这样? 这似乎不必要地笨重。 当然我可以轻松地为此编写自己的扩展方法,但这似乎是一个非常明显的遗漏,所以我想知道是否有任何充分的理由。 我无法相信微软已经忘记了这个function的无参数过载。

这个方法在将扩展方法添加到C#之前很久就已经存在了,在扩展方法之前,没有办法定义一个实例方法/属性,例如xyz.IsNullOrEmpty() ,如果xyznull ,你仍然可以调用它。

如果String为null ,则调用IsNullOrEmpty()将导致NullReferenceException

  String test = null; test.IsNullOrEmpty(); // Instance method causes NullReferenceException 

现在我们有扩展方法,我们可以使用扩展方法实现它,并避免exception。 但总是要记住,这只能起作用,因为扩展方法只不过是静态方法的语法糖。

 public static class StringExtension { public static Boolean IsNullOrEmpty(this String text) { return String.IsNullOrEmpty(text); } } 

使用此扩展方法,后续操作永远不会抛出exception

  String test = null; test.IsNullOrEmpty(); // Extension method causes no NullReferenceException 

因为这只是语法糖。

  StringExtension.IsNullOrEmpty(test); 

在C#3.0和扩展方法之前,无法在null对象上调用方法。

没有实例方法的原因是因为如果字符串确实为null,则会抛出myString.IsNullOrEmpty。

我创建了一个扩展方法 – IsNothing – 它不仅会检查它是null还是空,还只包含空格。

 public static bool IsNothing( this string source ) { if (source == null || source.Length == 0) { return true; } else if (source.Trim().Length == 0) { return true; } return false; } 

虽然完全有可能(并且有效)定义一个扩展方法来实现这一点,但我会担心它在语法上看起来很奇怪,因为它似乎是对一个可能为null的对象的方法调用。

YMMV,但我会坚持使用String.IsNullOrEmpty

你可以在C#3.0中实现这一点:

 public static class StringExtensions { public static bool IsNullOrEmpty(this string value) { return string.IsNullOrEmpty(value); } } 

然后,这将工作:

 test.IsNullOrEmpty(); 

重要的是要知道许多人认为这是不好的做法。 这是因为它违反了用户的期望。 谨慎使用。

如果您正在添加扩展方法或辅助方法来测试字符串,您可能还想添加一个修剪字符串的方法,以及我们大多数人在许多情况下也不希望字符串具有空格,例如选项卡或空格。

这是我们的测试方法之一

public static bool IsTrimStringNullOrEmpty(string value)
{
if(value == null)返回true;
if(value.Trim()== string.Empty)返回true;
返回虚假;
}

要么

如果要测试该值并在NotNullOrEmpty的同时对其进行修剪

public static bool IsTrimStringNullOrEmpty(ref string value)
{
if(value == null)返回true;
value = value.Trim();
if(value == string.Empty)返回true;
返回虚假;
}