Was entspricht Java final
in C #?
c#
access-modifiers
reserved-words
Nosrama
quelle
quelle
Antworten:
Das
final
Schlüsselwort wird in Java mehrfach verwendet. Es entspricht sowohl diesealed
undreadonly
Schlüsselwort in C #, je nach Kontext , in dem sie verwendet wird.Klassen
So verhindern Sie Unterklassen (Vererbung von der definierten Klasse):
Java
C #
Methoden
Verhindern Sie das Überschreiben einer
virtual
Methode.Java
C #
Wie Joachim Sauer betont, besteht ein bemerkenswerter Unterschied zwischen den beiden Sprachen darin, dass Java standardmäßig alle nicht statischen Methoden als
virtual
kennzeichnet, während C # sie als kennzeichnetsealed
. Daher müssen Sie dassealed
Schlüsselwort in C # nur verwenden, wenn Sie das weitere Überschreiben einer Methode stoppen möchten, dievirtual
in der Basisklasse explizit markiert wurde.Variablen
So können Sie eine Variable nur einmal zuweisen:
Java
C #
Nebenbei bemerkt unterscheidet sich die Wirkung des
readonly
Schlüsselworts von der desconst
Schlüsselworts darin, dass derreadonly
Ausdruck zur Laufzeit und nicht zur Kompilierungszeit ausgewertet wird , wodurch beliebige Ausdrücke zulässig sind.quelle
readonly
Mitgliedsvariablen können in Konstruktoren geändert werden: pastebin.com/AzqzYGiADas hängt vom Kontext ab.
final
Klasse oder Methode ist das C # -Äquivalentsealed
.final
Feld ist das C # -Äquivalentreadonly
.final
lokale Variable oder einen Methodenparameter gibt es kein direktes C # -Äquivalent.quelle
For a final local variable or method parameter, there's no direct C# equivalent
eine große Unterscheidung.const
kann nur für Werttypen verwendet werden. Soweit ich weiß, gibt es keine Möglichkeit, eine effektive Konstante für einen lokalen Referenztyp zu erstellen.Was hier allen fehlt, ist die Garantie von Java für die endgültige Zuordnung der endgültigen Mitgliedsvariablen.
Für eine Klasse C mit der endgültigen Mitgliedsvariablen V muss jeder mögliche Ausführungspfad durch jeden Konstruktor von C genau einmal V zuweisen. Wenn V nicht oder V nicht zweimal oder mehrmals zugewiesen wird, führt dies zu einem Fehler.
Das schreibgeschützte Schlüsselwort von C # hat keine solche Garantie - der Compiler ist mehr als glücklich, schreibgeschützte Mitglieder nicht zugewiesen zu lassen oder sie innerhalb eines Konstruktors mehrmals zuweisen zu können.
Final und Readonly (zumindest in Bezug auf Mitgliedsvariablen) sind definitiv nicht gleichwertig - final ist viel strenger.
quelle
Wie bereits erwähnt,
sealed
entspricht diesfinal
Methoden und Klassen.Im Übrigen ist es kompliziert.
Für
static final
Felderstatic readonly
ist das nächstmögliche möglich. Sie können das statische Feld in einem statischen Konstruktor initialisieren, der dem statischen Initialisierer in Java ziemlich ähnlich ist. Dies gilt sowohl für Konstanten (Grundelemente und unveränderliche Objekte) als auch für konstante Verweise auf veränderbare Objekte.Der
const
Modifikator ist für Konstanten ziemlich ähnlich, aber Sie können sie nicht in einem statischen Konstruktor festlegen.readonly
kann es verwendet werden. Es ist jedoch nicht gleich -final
erfordert genau eine Zuweisung, selbst im Konstruktor oder Initialisierer.Es gibt kein C # -Äquivalent für eine
final
mir bekannte lokale Variable. Wenn Sie sich fragen, warum jemand es braucht: Sie können eine Variable vor einem if-else, switch-case oder so deklarieren . Indem Sie es für endgültig erklären, erzwingen Sie, dass es höchstens einmal zugewiesen wird.Lokale Java-Variablen müssen im Allgemeinen mindestens einmal zugewiesen werden, bevor sie gelesen werden. Sofern der Zweig nicht vor dem Lesen des Werts herausspringt, wird eine endgültige Variable genau einmal zugewiesen. All dies wird zur Kompilierungszeit überprüft. Dies erfordert gut erzogenen Code mit weniger Spielraum für einen Fehler.
Zusammenfassend hat C # kein direktes Äquivalent von
final
. Während Java einige nette Funktionen von C # fehlt, ist es für mich als Java-Programmierer erfrischend zu sehen, wo C # kein Äquivalent liefert.quelle
Java-Klasse final und Methode final -> versiegelt. Java-Mitgliedsvariable final -> schreibgeschützt für Laufzeitkonstante, const für Kompilierungszeitkonstante.
Keine Entsprechung für Local Variable final und method argument final
quelle
http://en.csharp-online.net/CSharp_FAQ:_What_are_the_differences_between_CSharp_and_Java_constant_declarations
C # -Konstanten werden mit dem Schlüsselwort const für Konstanten zur Kompilierungszeit oder dem Schlüsselwort readonly für Laufzeitkonstanten deklariert. Die Semantik von Konstanten ist sowohl in der C # - als auch in der Java-Sprache gleich.
quelle
versiegelt
quelle