Frage

Nach einem Vorfall bei der Arbeit, bei dem ich String.IsNullOrEmpty mit einer Sitzungsvariablen missbraucht habe, weigert sich nun ein Kollege von mir, meine Verwendung von String.IsNullOrEmpty zu akzeptieren.Nach einigen Recherchen ist offenbar ein Fehler für IsNullOrEmpty auf MSDN aufgeführt (Verknüpfung) (Hinweis unten lesen):

Ab dem 4. April 2006 gibt es einen Fehler (möglich in der JIT), der diese Methode fehlschlägt, wenn Optimierungen eingeschaltet sind.Es ist bekannt, dass es sowohl C# als auch VB beeinflusst.

Weitere Informationen finden Sie hier (Verknüpfung).Microsoft hat den Fehler „angeblich“ nach Orcas behoben, aber leider verwendet mein Arbeitgeber immer noch VS2005.Aber wenn das Problem 2008+ behoben wird, dann sei es so.Das ist für mich völlig in Ordnung.

Während die Ablehnung meines Codes mit IsNullOrEmpty durch meinen Kollegen für mich blinde Ignoranz (IMO) ist, kann er mir sicherlich nicht sagen, warum nicht um es anders zu verwenden als den Missbrauch mit der Sitzungsvariablen.Ich habe IsNullOrEmpty in unserem gesamten Code ohne jegliche Probleme verwendet.Persönlich finde ich es viel lesbarer, zusätzlich dazu, zwei Dinge in einer Aussage zu tun.

Nachdem ich nach Meinungen zu diesem Thema gegoogelt habe, habe ich Websites gefunden, die die Pro/Contra-Position vertreten.Hier sind einige der Seiten, die ich darüber gelesen habe:

https://blog.rthand.com/post/2006/06/22/1063.aspx

http://www.omegacoder.com/?p=105

Eine Seite (http://dotnetperls.com/isnullorempty) fasst die Methode (IMHO) ziemlich gut zusammen:

Hier haben wir uns angesehen, dass die IsnullorEmpty -Methode auf dem String -Type eine gute und relativ effiziente Methode zur Überprüfung bietet, ob eine Zeichenfolge in Ordnung ist, um zu speichern oder zu verwenden.Für die Leistung ist es jedoch möglicherweise besser, manuelle Nullprüfungen zu verwenden.Leere Saiten können auch auf andere Weise getestet werden, und meine Forschung hier zeigt, dass die Überprüfung der Länge am schnellsten ist.

Angenommen, die Fehlerbehebung ist in VS2008/2010/etc. vorhanden (und funktioniert ordnungsgemäß), gibt es dafür einen Grund? nicht String.IsNullOrEmpty mit VS2005 und höher verwenden?Mir ist klar, dass das im Vergleich zu solch einer albernen kleinen Methode etwas übertrieben erscheint, aber ich würde gerne wissen, ob sich hinter den Kulissen noch mehr abspielt und ob jemand alternative Erklärungen hat.

War es hilfreich?

Lösung

Dieses Problem behebt .NET 2.0 sp1 in. Es gibt keinen Grund, jetzt seine Verwendung zu vermeiden.

Wenn Sie mit .NET 2, sollten Sie sp1 für viele andere Gründe haben sowieso. - Ich sehe keinen Grund, dies für einen Fehler zu vermeiden, die nicht mehr existiert

Andere Tipps

Ich habe vor zu dem Fehler gehört, und von dem, was ich sammeln kann tritt nie in einem echten Code, nur in Code wie das Beispiel, das nicht wirklich etwas zu tun hat. Außerdem ist der Fehler nicht mit der IsNullOrEmpty Methode selbst, so dass es unabhängig davon auftreten würde, wie Sie die Zeichenfolge überprüfen.

Wenn die Methode genau das tut, was Sie tun wollen, sollten Sie es verwenden. Allerdings sollten Sie es nicht in jeder Situation nutzen für eine leere Zeichenfolge zu überprüfen. Manchmal möchte man nur prüfen, ob der String leer ist und nicht, wenn es null.

Wenn das String-Variable null ist, wird dies nur den Codeblock überspringen:

 if (!String.IsNullOrEmpty(str)) { ... }

Wenn das String-Variable null ist, wird dies eine Ausnahme verursachen:

 if (str.Length > 0) { ... }

Wenn die Variable nicht null sein soll, möchten Sie wahrscheinlich die Ausnahme anstatt den Code, um den Nullwert als eine leere Zeichenfolge zu behandeln. Wenn etwas nicht stimmt wollen, dass es so früh wie möglich zu fangen, weil es schwieriger sein wird, das Problem auf die Quelle zurück zu verfolgen, je länger die Ausnahme von der Ursache ist.

Sie könnten einen Unit-Test schreiben, der eine leere Zeichenfolge und eine übergibt, der eine leere Zeichenfolge übergibt diese Sachen zu testen, und es in VS2005 und nach im Jahr 2008 laufen und sehen, was passierte

In diesem Fehlerbericht in der Verbindung sind Sie es heißt:

  

Dieser Fehler wurde in dem Microsoft .NET Framework 2.0 Service Pack 1 (SP1).

fixed

Da dies der Fall ist, sollte es keine Rolle, ob Sie verwenden VS 2005 so lange wie Sie SP1 für .NET 2 installiert.

Als ob oder nicht, es zu benutzen, lesen Sie in diesem Beitrag von Coding .

Wir verwenden eine Erweiterungsmethode für string.IsNullOrEmpty:

public static bool IsNullOrEmpty(this string target)
{
  return string.IsNullOrEmpty(target);
}

Mit diesem Ansatz, auch wenn es in einigen früheren Version pleite waren, ist ein Bugfix nur eine Zeile Code.

Und das addierte Nutzen der Lage, das Verfahren auf einer String-Instanz zu verwenden, das null sein könnte:

string myString = null;
if (myString.IsNullOrEmpty())
{
  // Still works
}

Ich bin mir ziemlich sicher, dass es auf der SP1 behoben, aber trotzdem können Sie Ihre eigenen null oder leer Methode erstellen:)

Wie bei jeder Sprache oder einen Teil davon, es ist alles über die Vor / Nachteile kennen und machen eine fundierte Entscheidung auf der Grundlage dieser Informationen. IMHO.

Wenn Arguments in APIs Überprüfung der Umsetzung, ich in der Regel für jede Bedingung separat prüfen und verschiedene Ausnahmen auslösen: ArgumentNullException für eine Null-Referenz oder in Abhängigkeit von den API-Spezifikationen, ArgumentException für einen leeren String. In diesem Fall String.IsNullOrEmpty Verwendung ermöglicht es Ihnen nicht zwischen diesen beiden getrennten Fehlerbedingungen zu unterscheiden.

if (str == null)
{
    throw new ArgumentNullException("str");
}
if (str == string.Empty)
{
    throw new ArgumentException("The string cannot be empty.", "str");
}

Wenn es in Ihrer Version gebrochen ist, dann ist es trivial, nur eine statische Methode, die die Prüfung tun, so einfach tun:

public static bool isNull(String s) {
  return s == null || s.trim().length == 0;
}

Kein Punkt in dem Einstieg in ein großes Problem über etwas, das relativ einfach sein sollte zu beheben.

Sie müssen nicht überall ändern, wenn Sie eine globale ersetzen einer statischen Methode mit einem anderen tun.

Ich frage mich, warum die Leute string.Empty verwenden. Das ist keine gute Sache, weil es sich um einen initialisierten String handelt und dieses Konzept nur im .Net-Frame überall dort existiert, wo es sich um einen gültigen String mit einer Länge von 0 handelt (DB-Server unterscheiden sehr klar zwischen diesen und werden sich beschweren wenn Sie eine Logikprüfung auf Null haben, aber eine leere Zeichenfolge erhalten).Ich denke, dass String.IsnullorEMpty eines der 5 schlimmsten Praktiken/Funktionen ist, die ich je gesehen habe, weil es irgendwie ermutigt/es in Ordnung aussehen lässt, Menschen zu initieren, um ihre Saiten zu initiieren und als Null behandelt zu werden.Diese Funktion hätte nie hinzugefügt werden dürfen und ich denke, die .Net-Leute sollten versuchen, sie auslaufen zu lassen:) Wer braucht schon einen leeren String?Ich habe es nie verwendet, es sei denn, ich musste es aufgrund bestehender Projekte verwenden

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top