Was ist das Java-Finale in C #?

Was ist das Java- final in C #?

    Das final Schlüsselwort hat mehrere Verwendungszwecke in Java. Sie entspricht sowohl den sealed als auch den readonly Keywords in C #, abhängig vom Kontext, in dem sie verwendet wird.

    classn

    Um Unterklassen zu vermeiden (inheritance aus der definierten class):

    Java

     public final class MyFinalClass {...} 

    C #

     public sealed class MyFinalClass {...} 

    Methoden

    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() {...} } 

    Joachim Sauer weist darauf hin, dass ein wesentlicher Unterschied zwischen den beiden Sprachen darin besteht, dass Java standardmäßig alle nicht statischen Methoden als virtual markiert, während C # sie als sealed markiert. Daher müssen Sie das Schlüsselwort sealed in C # verwenden, wenn Sie das weitere Überschreiben einer Methode beenden möchten, die in der Basisklasse explizit als virtual markiert wurde.

    Variablen

    Um nur eine Variable einmalig zu vergeben:

    Java

     public final double pi = 3.14; // essentially a constant 

    C #

     public readonly double pi = 3.14; // essentially a constant 

    Als Nebenbemerkung unterscheidet sich die Wirkung des Schlüsselworts readonly von der des Schlüsselworts const , da der Ausdruck readonly zur Laufzeit und nicht zur Kompilierzeit ausgewertet wird , wodurch beliebige Ausdrücke möglich sind.

    Es hängt vom Kontext ab.

    • Für eine final class oder Methode ist das C # -Äquivalent sealed .
    • Für ein final Feld ist das C # readonly nur readonly .
    • Für einen final lokalen Variablen- oder Methodenparameter gibt es kein direktes C # -Aquivalent.

    Was alle hier vermissen, ist Javas garantierte endgültige Zuordnung für die letzten Membervariablen.

    Für eine class C mit der letzten Elementvariable V muss jeder mögliche Ausführungspfad durch jeden Konstruktor von C V genau einmal zuweisen – wenn es nicht gelingt, V zuzuordnen oder V zwei oder mehr Mal zuzuweisen, führt dies zu einem Fehler.

    C # ‘s readonly Schlüsselwort hat keine solche Garantie – der Compiler ist mehr als glücklich, schreibgeschützte Mitglieder nicht zugewiesen zu lassen oder Ihnen zu erlauben, sie mehrfach innerhalb eines Konstruktors zuzuweisen.

    Endgültig und readonly (zumindest in Bezug auf Mitgliedsvariablen) sind definitiv nicht gleichwertig – das Finale ist viel strenger.

    Abschluss der Java-class und Abschluss der Methode -> versiegelt. Java Member Variable final -> nur für Laufzeitkonstante, const für Kompilierzeitkonstante.

    Keine Entsprechung für das letzte Argument der lokalen Variablen und das letzte Argument der Methode

    Wie erwähnt, ist sealed ein Äquivalent von final für Methoden und classn.

    Im übrigen ist es kompliziert.

    • Auf einer in der Deklaration definierten (statischen) Konstante kann const als gleichwertig betrachtet werden, vorausgesetzt, es ist ein primitiver Typ oder eine unveränderliche class.
    • Auf einem Feld, das nicht neu zugewiesen werden soll, sobald es den Konstruktor verlässt, kann readonly verwendet werden, aber es ist nicht gleich – final erfordert genau eine Zuweisung sogar im Konstruktor.
    • Eine lokale Variable, die nur einmal zugewiesen werden soll, kann nicht in C # erstellt werden, nehme ich an. Wenn Sie sich fragen, warum jemand es brauchen sollte: Sie können eine Variable vor einigen if-else, switch-case oder so deklarieren. Wenn Sie es als endgültig deklarieren, erzwingen Sie, dass es genau einmal zugewiesen wird, andernfalls tritt ein Compilererrors auf. Dies erfordert Code mit gutem Verhalten, sodass weniger Fehler auftreten.

    Zusammengefasst, C # hat kein direktes Äquivalent zum final . Während Java einige nette Features von C # fehlt, ist es für mich als meist Java-Programmierer erfrischend zu sehen, wo C # kein Äquivalent liefert.

    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 Kompilierzeitkonstanten oder dem Schlüsselwort readonly für Laufzeitkonstanten deklariert. Die Semantik von Konstanten ist in den C # – und Java-Sprachen identisch.

    versiegelt