2013-08-29 17 views
14

MS Analyzer string.IsNullOrEmpty empfiehlt stattdessen die Verwendung von entweder mit null oder einem leeren Zeichenfolge aus Performance-Gründen comparisingWarum ist string.IsNullOrEmpty schneller als ein Vergleich?

Warning 470 CA1820: Microsoft.Performance: Ersetzen Sie den Aufruf von 'string.operator == (string, string)' in ... mit einem Aufruf von 'String.IsNullOrEmpty'.

Warum ist das? Sollte nicht die Anforderung, eine andere Funktion aufzurufen und eine Referenz an ein Objekt zu übergeben, das dann sowieso irgendeine Art von Vergleich durchführen muss, teurer sein, als den Vergleich selbst durchzuführen?

Beispielcode

void Foo() 
{ // throws a warning 
    string x = "hello world"; 
    if (x == null || x == "") 
    { 
     Console.WriteLine("Empty"); 
    } 
} 

void Foo() 
{ // doesn't throw it 
    string x = "hello world"; 
    if (string.IsNullOrEmpty(x)) 
    { 
     Console.WriteLine("Empty"); 
    } 
} 
+2

Zeigen Sie den Code Sie vergleichen 'String.IsNullOrEmpty' mit. – MarcinJuraszek

+0

mögliche Antwort http://stackoverflow.com/questions/10360370/why-is-string-isnullorempty-faster-than-string-length – Sachin

+0

http://www.dotnetperls.com/isnullorempty – Cynede

Antwort

12

MS Analyzer string.IsNullOrEmpty empfiehlt stattdessen zu verwenden, um es von comparising entweder mit null oder einem leeren Zeichenfolge aus Performance-Gründen

Warning 470 CA1820: Microsoft.Performance: Ersetzen Sie den Aufruf von ‚string.operator == (String, String) 'in ... mit einem Aufruf von' String.IsNullOrEmpty '.

Gerade read the fine manual:

ist eine Zeichenfolge, auf die leere Zeichenfolge verglichen mit Object.Equals verwenden.

...

Vergleicht Strings die String.length Eigenschaft oder die String.IsNullOrEmpty Methode ist wesentlich schneller als Equals verwenden. Dies liegt daran, dass Equals wesentlich mehr MSIL-Anweisungen als entweder IsNullOrEmpty oder die Anzahl der ausgeführten Anweisungen ausführt, um den Längeneigenschaftswert abzurufen und mit Null zu vergleichen.

...

Um einen Verstoß gegen diese Regel zu beheben, den Vergleich ändern Sie die Eigenschaft Länge und Test für das Null-String zu verwenden. Wenn Sie .NET Framework 2.0 als Ziel verwenden, verwenden Sie die IsNullOrEmpty-Methode.

Ihr Problem ist nicht so sehr der null Scheck, sondern für die Gleichstellung Prüfung (via Equals) mit einer leeren string Instanz anstatt seine Length überprüfen.

Wieder vom feinen Handbuch:

public void EqualsTest() 
    { 
    // Violates rule: TestForEmptyStringsUsingStringLength. 
    if (s1 == "") 
    { 
     Console.WriteLine("s1 equals empty string."); 
    } 
    } 

    // Use for .NET Framework 1.0 and 1.1. 
    public void LengthTest() 
    { 
    // Satisfies rule: TestForEmptyStringsUsingStringLength. 
    if (s1 != null && s1.Length == 0) 
    { 
     Console.WriteLine("s1.Length == 0."); 
    } 
    } 
2

IsNullOrEmpty wird inlined werden so vermieden wird der Aufwand für die Methode aufrufen. Mit Blick auf das Verfahren wird mit dem Attribut dekoriert

[__DynamicallyInvokable, TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")] 

Ich würde auch hinzufügen, dass IsNullOrEmpty ist klarer und aussagekräftiger aus einer Ablesbarkeit Sicht (meiner Meinung nach).

Was die Leistung angeht, wäre ich überrascht, wenn es einen wirklichen Unterschied gäbe, wenn Sie value.Length == 0; anstelle von x == "" verwenden würden. Intern hat IsNullOrEmpty diese

return value == null || value.Length == 0; 

nicht

if (x == null || x == "") 

eine Eigenschaft weniger Aufwand erfordert als die Gleichheit der Berechnung Lesen.

+2

Also welche Leistung wird durch den Aufruf von String.IsNullOrEmpty (var) anstelle von (var == null || var == String.Empty) gewonnen? – sisve

+0

"klarer und anschaulicher?" Wie viel klarer und beschreibender als 'str! = Null && str! =" "' Kannst du bekommen? – Jon

+0

@Jon - Fair genug, ich habe IMO hinzugefügt. Allerdings wäre Englisch für mich klarer als Symbole. 'IsNullOrEmpty' ist selbsterklärend,' str! = Null && str! = "" 'Ist nicht so viel (obwohl nicht gerade schwer zu entziffern) IMHO. – keyboardP

Verwandte Themen