Frage

    

Diese Frage bereits eine Antwort hier:

    
            
  •              C # 'ist' Bedienerleistung                                      8 Antworten                          
  •     
    

Es ist gezeigt dass ‚als‘ Casting ist viel schneller als Präfix Gießen , aber was ‚ist‘ Reflexion? Wie schlimm ist es? Wie Sie sich vorstellen können, die Suche nach ‚ist‘ auf Google nicht sehr wirksam ist.

War es hilfreich?

Lösung

Es gibt ein paar Optionen:

  1. Der klassische Guss : Foo foo = (Foo)bar
  2. Die as Cast-Operator : Foo foo = bar as Foo
  3. Die is Test : bool is = bar is Foo

  1. Der klassische Guss muss überprüfen, ob bar sicher Foo gegossen wird (schnell), und dann tatsächlich tut es (langsamer), oder eine Ausnahme auslösen (sehr langsam).
  2. Der as Operator muss überprüfen, ob bar gegossen werden kann, dann die Besetzung zu tun, oder wenn es nicht sicher gegossen werden kann, dann ist es wieder nur null.
  3. Die is Operator prüft nur, ob bar zu Foo gegossen werden kann, und eine boolean zurück.

Der is Test ist schnell, weil es nur den ersten Teil eines vollständigen Gießvorgang tut. Der as Operator ist schneller als eine klassische Besetzung, da keine Ausnahme auslösen, wenn die Umwandlung fehlschlägt (was für Situationen ist es gut macht, wo man zu Recht erwartet, dass die Besetzung scheitern könnte).

Wenn Sie nur wissen müssen, wenn die Variable einen bar Foois dann verwenden Sie die is Operator, ABER , wenn Sie vorhaben, zu testen, ob bar ein Foo ist, und wenn ja, dann warf es , dann sollten Sie die as Operator.

Im Wesentlichen muss jeder Guss das Äquivalent einer is Prüfung tun intern zu beginnen, um sicherzustellen, dass die Besetzung gültig ist. Also, wenn Sie tun, um eine is Prüfung durch eine Besetzung gefolgt (entweder ein as gegossen oder mit dem klassischen Cast-Operator) Sie sind die is Prüfung zweimal effektiv zu tun, was ein leichter zusätzlicher Aufwand ist.

Andere Tipps

So wie ich es gelernt habe, ist, dass diese:

if (obj is Foo) {
  Foo f = (Foo)obj;
  f.doSomething();
}

ist langsamer als das:

Foo f = obj as Foo;
if (f != null) {
  f.doSomething();
}

Ist es langsam genug, um eine Rolle? Wahrscheinlich nicht, aber es ist so eine einfache Sache Aufmerksamkeit zu bezahlen, dass Sie könnte genauso gut tun.

„ist“ ist im Grunde gleichbedeutend mit dem „isinst“ IL Operator - was dieser Artikel so schnell beschreibt

.

Es sollte schnell genug sein, um keine Rolle. Wenn Sie den Typ eines Objekts genug sind, überprüft es einen spürbaren Einfluss auf die Leistung, damit Sie müssen Ihr Design zu überdenken

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