2010-12-10 9 views
8

ich oft in Quellcodes sehen die Verwendung von if (object.ReferenceEquals (myObject, null)) zum Prüfen, ob myObject null statt if (myObject == null) die ich kenne.beste und schnellste Weg, um zu überprüfen, ob ein Objekt null ist

Gibt es einen bestimmten Grund (wie Geschwindigkeit, Lesbarkeit, etc.) für die Verwendung der ersten anstelle der zweiten? Welchen benutzen Sie?

Vielen Dank im Voraus.

Antwort

5

Wenn Sie ReferenceEquals verwenden, stellen Sie sicher, dass keine spezielle Behandlung (zB überladener Operator) angewendet wird. Dies führt auch zu unterschiedlichen Ergebnissen bei Verwendung mit ungebundenen Generika.

3

Werfen Sie einen Blick auf diesem interessanten Artikel

Performance Tip: Prefer (((Object) x)== null) to Object.ReferenceEquals(x,null)

+0

Dieser Artikel ist veraltet, es kommt zu den falschen Schlussfolgerungen. Die IL ist für beide Ansätze in .NET 4.0 und höher genau gleich. Sie können das leicht sehen, indem Sie die Beispiele in diesem Artikel ausprobieren. Zur besseren Lesbarkeit würde ich 'ReferenceEquals' vorschlagen. – Abel

1

Der == Operator kann durch Klassenimplementierungen überlastet werden, so dass es möglicherweise einen Verweis Vergleich nicht tun (obwohl es wahrscheinlich mit null s soll). object.ReferenceEquals kann nicht, so dass es immer zuverlässig einen Referenzvergleich gibt.

Prost Matthias

1

Die Reference Methode können Sie sicher sein kann, wird die Objektreferenzen nicht außer Kraft gesetzt und so immer sein, dass der Vergleich zu vergleichen und nicht zu einem gewissen Überschreibung der Equals-Methode übergeben werden.

4

Einfache Dinge sind in der Regel die effizienteste: (myObject == null) performanter

Blick auf this Artikel ist

+0

Der referenzierte Artikel ist zwar ein scheinbar interessanter Lesevorgang, zielt aber auf .NET 2.0 ab. Zu der Zeit war .NET 4.0 für einige Zeit out und es gibt keinen Unterschied zwischen der Verwendung von '(object) myObj == null' und' ReferenceEquals'. Allerdings ist Ihr Vorschlag in diesem Post (vor 7 Jahren) sehr gefährlich (wie in dem verlinkten Artikel erklärt) und sollte sicherlich nicht ohne eine Besetzung verwendet werden (es sei denn, Sie wollen wirklich eine mögliche Überladung verwenden, aber dann "performant") "hat nichts damit zu tun). – Abel

1

Sie in der Regel die gleiche Wirkung haben, obwohl sie sich auf verschiedene Dinge zusammenstellen. if (myObject == null) ergibt einen ceq Opcode, den ich erwarten würde, zu schnellerem Code zu kompilieren. object.ReferenceEquals ist ein Methodenaufruf wie jeder andere auch.

Sie sind anders, wenn myObject eine operator= Methode hat; Wenn dies vorhanden ist, ruft Ihr Code diese Methode auf, anstatt ceq zu verwenden. operator= kann dann tun, was es will.

Immer if (myObject == null), es sei denn, Sie haben einen Grund nicht zu.

+0

Nur weil es ein Methodenaufruf in IL ist, bedeutet das nicht, dass es ein Methodenaufruf ist, sobald der Jitter beendet ist. Der Referenzwert ist sehr kurz, daher ist er wahrscheinlich inline. Und sein Inhalt ist nur 'obj1 == obj2', also erwarte ich genau die gleiche Leistung wie mit ==, aber es wirft die Argumente auf Objekt, so dass überladene == Operatoren es nicht beeinflussen. – CodesInChaos

+0

Es ist _nicht_ ein "Methodenaufruf wie jeder andere", wenn es kompiliert wird, wird die IL _nicht_ diese Methode aufrufen, stattdessen werden spezielle IL-Codes verwendet, die für beide Ansätze gleich sind (seit .NET 4.0). @CodesInChaos hat recht, es ist genau die gleiche Leistung (und IL). – Abel

Verwandte Themen