Frage

Ich habe so etwas wie die folgenden ein paar Mal gesehen ... und ich hasse es. Ist das grundsätzlich die Sprache ‚Betrug‘? Oder .. werden Sie als die ‚ok‘ sein, weil die IsNullOrEmpty zuerst ausgewertet wird, die ganze Zeit?

(Wir könnten argumentieren, ob eine Zeichenfolge NULL sein sollte, wenn es aus einer Funktion kommt, aber das ist nicht wirklich die Frage.)

string someString;
someString = MagicFunction();

if (!string.IsNullOrEmpty(someString) && someString.Length > 3)
{
    // normal string, do whatever
}
else
{
   // On a NULL string, it drops to here, because first evaluation of IsNullOrEmpty fails
   // However, the Length function, if used by itself, would throw an exception.
}

EDIT: Nochmals vielen Dank an alle für mich diese Sprache grundlegenden erinnert. Während ich wusste, „warum“ es funktioniert, kann ich nicht glauben, dass ich nicht wusste, / erinnern den Namen des Konzepts.

(Falls jemand einen Hintergrund will .. Ich kam auf dieser bei der Fehlersuche Ausnahmen erzeugt durch NULL-Strings und .Length> x Ausnahmen ... an verschiedenen Stellen des Codes. Wenn also sehe ich den obigen Code, zusätzlich zu alles andere, meine Frustration übernahm von dort aus.)

War es hilfreich?

Lösung

Sie sind die Vorteile einer Sprache-Funktion als Kurzschluss bekannt. Dies ist Betrug nicht die Sprache, sondern in der Tat mit einer Funktion genau, wie es verwendet wurde, um entworfen zu werden.

Andere Tipps

Wenn Sie gefragt werden, ob es ok auf dem „Kurzschluss“ relationale Operatoren && und || abzuhängen, dann ja, das ist völlig in Ordnung.

Es ist nichts falsch mit diesem, wie Sie wollen einfach nur sicher, Sie werden nicht eine Nullpointer-Ausnahme erhalten.

Ich denke, dass es vernünftig ist, zu tun.

Mit Erweiterungen können Sie es sauberer machen, aber das Grundkonzept wäre immer noch gültig sein.

Dieser Code vollständig gültig ist, aber Ich mag den Null Coalesce Operator für vermeiden null Typprüfungen verwenden.

string someString = MagicFunction() ?? string.Empty;
if (someString.Length > 3)
{
    // normal string, do whatever
}
else
{
   // NULL strings will be converted to Length = 0 and will end up here.
}

Es gibt nichts falsch mit diesem.

if (Bedingungen werden von links nach rechts ausgewertet, so dass es völlig in Ordnung ist, sie so zu stapeln.

Dies ist gültige Code, meiner Meinung nach (obwohl einer Variable deklarieren und es in der nächsten Zeile zuweisen ziemlich nervig ist), aber Sie sollten wahrscheinlich feststellen, dass Sie den Else-Block auch in dem Zustand eintreten können, wenn die Länge der Zeichenfolge <3.

Das sieht für mich wie eine durchaus vernünftige Verwendung von logisch Kurz circuitting - wenn überhaupt, es ist Betrug mit der Sprache. Ich habe erst vor kurzem von VB6 kommen, die nicht taten immer Kurzschluss, und das ist wirklich ärgerlich ich .

Ein Problem zu achten ist, dass Sie für Null wieder in dieser else-Klausel testen, müssen möglicherweise, da - wie geschrieben - ich ist Wicklung dort oben mit dem beide Null-Strings und die Länge weniger als drei Saiten .

Das ist völlig in Ordnung, und es gibt nichts falsch mit ihm auf diese Weise verwendet wird. Wenn Sie das Verhalten für die Sprache als alle dokumentiert sind folgende ist gut. In C # die Syntax, die Sie verwenden, sind die bedingten logischen Operatoren und thier docemented bahviour auf MSDN

Für mich ist es das gleiche wie wenn Sie nicht verwenden Klammer für, wenn Multiplikation und Addition in der gleichen Aussage zu tun, weil die Sprache dokumentiert, dass die Multiplikationsoperationen zuerst ausgeführt werden auszusteigen.

Unter Berufung auf einen Kurzschluss ist die „richtige Sache“ in den meisten Fällen zu tun. Es führt zu knapperem Code mit weniger beweglichen Teilen. Das bedeutet im Allgemeinen leichter zu pflegen. Dies gilt insbesondere in C und C ++.

Ich würde überdenken ernst Einstellung jemanden, der nicht vertraut ist (und nicht weiß, wie zu verwenden) Kurzschließen Operationen.

Ich finde es OK :) Sie sind nur darauf achten, dass Sie nicht eine NULL Variable zugreifen können. Eigentlich habe ich immer solche Überprüfung tun, bevor sie eine Operation an meinem Variable tun (auch, wenn Sammlungen indizieren und so) - es ist sicherer, eine bewährte Methode, das ist alles ..

Es ist sinnvoll, weil C # standardmäßig Kurzschlüssen die Bedingungen, so dass ich denke, es ist in Ordnung, dass zu Ihrem Vorteil zu nutzen. In VB kann es einige Probleme, wenn der Entwickler verwendet und statt AndAlso.

Ich glaube nicht, es ist anders als so etwas wie folgt aus:

INT* pNumber = GetAddressOfNumber();

if ((pNUmber != NULL) && (*pNumber > 0))
{
  // valid number, do whatever
}
else
{
  // On a null pointer, it drops to here, because (pNumber != NULL) fails
  // However, (*pNumber > 0), if used by itself, would throw and exception when dereferencing NULL
}

Es dauert nur den Vorteil eines Merkmals in der Sprache. Diese Art von Idiom hat im allgemeinen Gebrauch gewesen, ich glaube, da C Booleschen Ausdrücken auf diese Weise gestartet Ausführung (oder was auch immer die Sprache tat es zuerst).)

Wenn es Code in C waren, die Sie in Assembly kompiliert, nicht nur Kurzschließen das richtige Verhalten, ist es schneller . In Maschine die Teile der if-Anweisung Langauge nacheinander ausgewertet. Nicht Kurzschluss ist langsamer.

Das Schreiben von Code kosten viel $ zu einem Unternehmen. Aber die Aufrechterhaltung es mehr kosten!

So

, ich bin OK mit dem Punkt: Chance gibt, dass diese Zeile Code wird nicht sofort von dem Typ zu verstehen, die sie lesen müssen und es in 2 Jahren korrigieren

.

Natürlich wird er gebeten, einen kritischen Produktions Fehler zu korrigieren. Er wird hier und dort suchen und kann dies nicht bemerkt.

Wir sollten immer Code für den nächsten Kerl und er kann weniger klug, dass wir sind. Für mich ist dies die einzige Sache zu erinnern.

Und das bedeutet, dass wir offensichtlich Sprachfunktionen nutzen und die andere zu vermeiden.

Alles Gute, Sylvain.

Ein bisschen off topic, aber wenn Sie Rand das gleiche Beispiel in vb.net wie folgt

dim someString as string
someString = MagicFunction()
if not string.IsNullOrEmpty(someString) and someString.Length > 3 then
    ' normal string, do whatever
else
    ' do someting else
end if

Dies würde Knall auf null (nichts) string gehen aber in VB.Net es Sie Code wie folgt in C # das gleiche tun

dim someString as string
someString = MagicFunction()
if not string.IsNullOrEmpty(someString) andalso someString.Length > 3 then
    ' normal string, do whatever
else
    ' do someting else
end if

Hinzufügen der andalso macht es die gleiche Art und Weise verhalten, auch ist es besser liest. als jemand, der die zweite vb man zeigen, dass die Anmeldung slighty anders ist und dafür easyer beide vb und c‘Entwicklung tut, um jemandem zu erklären, dass es eine differeance etc.

Drux

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