Was sind die Leistungsmerkmale von ‚ist‘ Reflexion in C #? [Duplikat]
-
09-06-2019 - |
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.
Lösung
Es gibt ein paar Optionen:
- Der klassische Guss :
Foo foo = (Foo)bar
- Die
as
Cast-Operator :Foo foo = bar as Foo
- Die
is
Test :bool is = bar is Foo
- Der klassische Guss muss überprüfen, ob
bar
sicherFoo
gegossen wird (schnell), und dann tatsächlich tut es (langsamer), oder eine Ausnahme auslösen (sehr langsam). - Der
as
Operator muss überprüfen, obbar
gegossen werden kann, dann die Besetzung zu tun, oder wenn es nicht sicher gegossen werden kann, dann ist es wieder nurnull
. - Die
is
Operator prüft nur, obbar
zu Foo gegossen werden kann, und eineboolean
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
Foo
is 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