C # stellt das Schlüsselwort ref
und bereit out
, um Argumente als Referenz zu übergeben. Die Semantik der beiden ist sehr ähnlich. Der einzige Unterschied besteht in der Initialisierung der Flaged Variable:
ref
erfordert, dass die Variable initialisiert wird, bevor sie an die Funktion übergeben wird,out
nicht.out
erfordert, dass die Variable innerhalb der Funktion initialisiert wird,ref
nicht.
Die Verwendungsfälle dieser beiden Schlüsselwörter sind auch fast gleich, und ihre zu häufige Verwendung wird meines Erachtens als Codegeruch angesehen (obwohl es gültige Verwendungsfälle wie die TryParse
und TryGetValue
Muster gibt).
Könnte aus diesem Grund jemand erklären, warum es in C # zwei sehr ähnliche Tools für so enge Anwendungsfälle gibt?
Unter MSDN wird außerdem angegeben, dass sie ein unterschiedliches Laufzeitverhalten aufweisen:
Obwohl die Schlüsselwörter ref und out ein unterschiedliches Laufzeitverhalten verursachen, werden sie beim Kompilieren nicht als Teil der Methodensignatur betrachtet.
Wie unterscheidet sich ihr Laufzeitverhalten?
Fazit
Beide Antworten sehen richtig aus, danke euch beiden. Ich habe die von jmoreno akzeptiert , weil sie expliziter ist.
ref
in C ++ implementiert . auf Zeiger auf den fraglichen Objektzeiger (oder das fragliche Grundelement). dhInt32.TryParse(myStr, out myInt)
(C #) wird auf die gleiche Weise wieint32_tryParse(myStr, &myInt)
(C) "ausgeführt" ; Der einzige Unterschied sind einige Einschränkungen, die vom Compiler erzwungen werden, um Fehler zu vermeiden. (Ich werde dies nicht als Antwort posten, weil ich mich vielleicht irre, wie dies hinter den Kulissen funktioniert, aber ich stelle mir das so vor [weil es Sinn macht])