2009-04-24 17 views
7

Quando si cerca di capire se una stringa è nullo o vuoto, di solito hanno la stringa già. È per questo che mi sarei aspettato una funzione di utilità come ad esempio String.IsNullOrEmpty() per lavorare senza parametri:Perché non esiste un metodo di overload IsNullOrEmpty senza parametri?

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

Tuttavia, questo non funziona, perché IsNullOrEmpty si aspetta un parametro di stringa. Invece, devo scrivere:

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

Perché è così? Sembra inutilmente goffo. Naturalmente posso facilmente scrivere il proprio metodo di estensione per questo, ma sembra un'omissione molto ovvia, quindi mi chiedo se ci sia una buona ragione per questo. Non posso credere che il sovraccarico senza parametri di questa funzione sia stato dimenticato da Microsoft.

risposta

27

Questo metodo è stato intorno a lungo prima di metodi di estensione sono stati aggiunti al C#, e prima di metodi di estensione, non c'era modo di definire un'istanza metodo/proprietà come xyz.IsNullOrEmpty() che si poteva ancora chiamare se xyz era null.

+0

Buon punto, anche se mi chiedo perché non colmino il vuoto ora che sarebbe possibile. –

+10

IsNullOrEmpty sembra essere implementato più piacevolmente come una proprietà, davvero, ma sfortunatamente non abbiamo proprietà di estensione. – mquander

27

Se la stringa fosse null, chiamare IsNullOrEmpty() causerebbe un NullReferenceException.

String test = null; 

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

Ora abbiamo metodi di estensione e possiamo perseguire questo obiettivo con un metodo di estensione e di evitare l'eccezione. Ma tenete sempre presente che questo funziona solo perché i metodi di estensione non sono altro che zucchero sintattico per i metodi statici.

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

Con questo metodo di estensione del follwing sarà mai generata un'eccezione

String test = null; 

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

perché è zucchero sintattico solo per questo.

StringExtension.IsNullOrEmpty(test); 
5

Prima di C# 3.0 e Metodi di estensione non c'era modo di chiamare un metodo su un oggetto nullo.

3

Il motivo non esiste un metodo esempio perché se la stringa è infatti nulla, myString.IsNullOrEmpty avrebbe gettato.

+0

Non se è implementato come un metodo di estensione, motivo per cui stavo chiedendo in primo luogo. –

0

Si potrebbe fare questo accadere in C# 3.0:

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

Poi, questo funzionerà:

test.IsNullOrEmpty(); 

MA

E 'importante sapere che molti considerano questo per essere una cattiva pratica Questo perché viola le aspettative dell'utente. Usare con quella cautela.

+0

Potresti approfondire un po 'il motivo per cui considereresti una cattiva pratica? Sospettavo qualcosa del genere, ed è per questo che ho posto la domanda in primo luogo, ma non riesco ancora a capire perché un comportamento intuitivo di una classe sarebbe negativo, non importa come viene implementato. Non vedo il modo in cui il metodo di estensione potrebbe diventare dannoso, soprattutto perché è comunque solo zucchero sintattico. –

2

ho creato un metodo di estensione - IsNothing - che controllerà non solo se è nullo o vuoto, ma anche contiene solo spazi.

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

Grazie per l'idea. – tvanfosson

+0

... e supera ancora i miei test unitari !!! – tvanfosson

0

Se siete nel processo di aggiunta di metodi di estensione o metodi di supporto per testare le stringhe si potrebbe desiderare di aggiungere anche uno che rifila la stringa così come la maggior parte di noi in molti casi, anche non si vuole una stringa che ha spazi bianchi come una tabulazione o spazi.

Qui è uno dei nostri metodi di prova

bool IsTrimStringNullOrEmpty (valore stringa) public static
{
        se (valore == null) return true;
        if (value.Trim() == stringa.Empty) restituisce true;
        reso falso;
}

O

Se si desidera verificare il valore e lo hanno rifilato allo stesso tempo, se NotNullOrEmpty

public static bool IsTrimStringNullOrEmpty (valore stringa ref)
{
        if (value == null) restituisce true;
        value = value.Trim();
        if (value == string.Empty) restituisce true;
        reso falso;
}

1

Mentre è del tutto possibile (e valido) per definire un metodo di estensione per raggiungere questo obiettivo, sarei interessato che sembra strano sintatticamente, in quanto sembra essere una chiamata di metodo su un oggetto che potrebbe essere nullo.

YMMV, ma rimarrò con String.IsNullOrEmpty.

Problemi correlati