2009-04-24 104 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