Antworten:
Das final
Schlüsselwort wird in Java mehrfach verwendet. Es entspricht sowohl die sealed
und readonly
Schlü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 virtual
Methode.
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 virtual
kennzeichnet, während C # sie als kennzeichnet sealed
. Daher müssen Sie das sealed
Schlüsselwort in C # nur verwenden, wenn Sie das weitere Überschreiben einer Methode stoppen möchten, die virtual
in 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 readonly
Schlüsselworts von der des const
Schlüsselworts darin, dass der readonly
Ausdruck zur Laufzeit und nicht zur Kompilierungszeit ausgewertet wird , wodurch beliebige Ausdrücke zulässig sind.
readonly
Mitgliedsvariablen können in Konstruktoren geändert werden: pastebin.com/AzqzYGiA
Das 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.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.
Wie bereits erwähnt, sealed
entspricht dies final
Methoden und Klassen.
Im Übrigen ist es kompliziert.
Für static final
Felder static 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.
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.