2009-04-24 77 views
7

当试图找出一个字符串是空还是空时,我通常已经有字符串了。这就是为什么我本来期望效用函数如String.IsNullOrEmpty()不带参数的工作:为什么没有没有参数的IsNullOrEmpty重载方法?

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

然而,这不起作用,因为IsNullOrEmpty需要一个字符串参数。相反,我必须写:

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

为什么会这样呢?看起来不必要的笨重。当然,我可以很容易地写出自己的扩展方法,但这似乎是一个非常明显的遗漏,所以我想知道是否有任何好的理由。我不能相信这个函数的无参数超载已经被微软忘记了。

回答

27

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

+0

好点,虽然它让我想知道为什么他们现在不填补空白,这是可能的。 – 2009-04-24 16:52:27

+10

IsNullOrEmpty看起来像它会被最愉快地实现为一个属性,真的,但不幸的是我们没有扩展属性。 – mquander 2009-04-24 16:54:55

27

如果字符串为null,则调用IsNullOrEmpty()将导致NullReferenceException

String test = null; 

test.IsNullOrEmpty(); // Instance method causes NullReferenceException 

现在我们有扩展方法,我们可以使用扩展方法实现这一点,并避免异常。但总是要记住,这只适用于扩展方法只不过是静态方法的语法糖。

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

有了这个扩展方法的follwing绝不会抛出异常

String test = null; 

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

,因为它只是语法糖这一点。

StringExtension.IsNullOrEmpty(test); 
5

在C#3.0和扩展方法之前,没有办法在空对象上调用方法。

3

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

+0

如果它是作为扩展方法实现的,则不是这样,这就是为什么我首先要问的原因。 – 2009-04-24 17:24:44

0

你可以做到这一点在C#3.0:

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

然后,这将工作:

test.IsNullOrEmpty(); 

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

+0

你能详细阐述一下为什么你会认为这是不好的做法?我怀疑这样的事情,这就是为什么我首先提出这个问题的原因,但我仍然不明白为什么一个班级的直觉行为会很糟糕,而不会意识到它是如何实施的。我不认为扩展方法会变得有害,特别是因为它只是语法糖。 – 2009-04-24 17:06:58

2

我创建了一个扩展方法 - IsNothing - 它不仅检查它是否为空或空,而且只包含空格。

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; 
} 
0

如果你在添加扩展方法或辅助方法来测试你的字符串的过程中,你可能也想添加一个修剪字符串以及我们大多数人在许多情况下也不愿意串具有空格,如制表符或空格。

下面是我们的测试方法之一

公共静态布尔IsTrimStringNullOrEmpty(字符串值)
{
       如果(价值== NULL)返回true;
        if(value.Trim()== string.Empty)return true;
        return false;
}

OR

如果你想测试值,并把它修剪的同时,如果NotNullOrEmpty

公共静态布尔IsTrimStringNullOrEmpty(REF字符串值)
{
        if(value == null)返回true;
        value = value.Trim();
        if(value == string.Empty)return true;
        return false;
}

1

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

YMMV,但我会坚持String.IsNullOrEmpty

相关问题