Antworten:
Das finalSchlüsselwort wird in Java mehrfach verwendet. Es entspricht sowohl die sealedund readonlySchlüsselwort in C #, je nach Kontext , in dem sie verwendet wird.
So verhindern Sie Unterklassen (Vererbung von der definierten Klasse):
Java
public final class MyFinalClass {...}
C #
public sealed class MyFinalClass {...}
Verhindern Sie das Überschreiben einer virtualMethode.
Java
public class MyClass
{
public final void myFinalMethod() {...}
}
C #
public class MyClass : MyBaseClass
{
public sealed override void MyFinalMethod() {...}
}
Wie Joachim Sauer betont, besteht ein bemerkenswerter Unterschied zwischen den beiden Sprachen darin, dass Java standardmäßig alle nicht statischen Methoden als virtualkennzeichnet, während C # sie als kennzeichnet sealed. Daher müssen Sie das sealedSchlüsselwort in C # nur verwenden, wenn Sie das weitere Überschreiben einer Methode stoppen möchten, die virtualin der Basisklasse explizit markiert wurde.
So können Sie eine Variable nur einmal zuweisen:
Java
public final double pi = 3.14; // essentially a constant
C #
public readonly double pi = 3.14; // essentially a constant
Nebenbei bemerkt unterscheidet sich die Wirkung des readonlySchlüsselworts von der des constSchlüsselworts darin, dass der readonlyAusdruck zur Laufzeit und nicht zur Kompilierungszeit ausgewertet wird , wodurch beliebige Ausdrücke zulässig sind.
readonlyMitgliedsvariablen können in Konstruktoren geändert werden: pastebin.com/AzqzYGiA
Das hängt vom Kontext ab.
finalKlasse oder Methode ist das C # -Äquivalentsealed .finalFeld ist das C # -Äquivalentreadonly .finallokale Variable oder einen Methodenparameter gibt es kein direktes C # -Äquivalent.For a final local variable or method parameter, there's no direct C# equivalenteine große Unterscheidung.
constkann 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.
Wie bereits erwähnt, sealedentspricht dies finalMethoden und Klassen.
Im Übrigen ist es kompliziert.
Für static finalFelder static readonlyist 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 constModifikator ist für Konstanten ziemlich ähnlich, aber Sie können sie nicht in einem statischen Konstruktor festlegen.
readonlykann es verwendet werden. Es ist jedoch nicht gleich - finalerfordert genau eine Zuweisung, selbst im Konstruktor oder Initialisierer.Es gibt kein C # -Äquivalent für eine finalmir 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.
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
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.