Question Quel est l'équivalent de la finale de Java en C #?


Quel est l'équivalent de Java final en C #?


494
2017-08-25 11:05


origine


Réponses:


le final Le mot clé a plusieurs utilisations en Java. Cela correspond à la fois sealed et readonly mots-clés en C #, selon le contexte dans lequel il est utilisé.

Des classes

Pour empêcher le sous-classement (héritage de la classe définie):

Java 

public final class MyFinalClass {...}

C #

public sealed class MyFinalClass {...}

Méthodes

Empêcher le dépassement d'un virtual méthode.

Java

public class MyClass
{
    public final void myFinalMethod() {...}
}

C #

public class MyClass : MyBaseClass
{
    public sealed override void MyFinalMethod() {...}
}

Comme le souligne Joachim Sauer, une différence notable entre les deux langages est que Java par défaut marque toutes les méthodes non statiques virtual, alors que C # les marque comme sealed. Par conséquent, il vous suffit d'utiliser le sealed mot-clé en C # si vous voulez arrêter de surcharger une méthode qui a été explicitement marquée virtual dans la classe de base.

Variables

Pour autoriser qu'une variable soit affectée une seule fois:

Java

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

C #

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

En guise de note, l’effet de la readonly mot-clé diffère de celui de la const mot-clé en ce que le readonly l'expression est évaluée à runtime plutôt que compilation, permettant ainsi des expressions arbitraires.


785
2017-08-25 11:06



Ça dépend du contexte.


156
2017-08-25 11:06



Ce qui manque à tout le monde, c'est la garantie de Java d'assignation définitive pour les variables membres finales.

Pour une classe C avec la variable membre finale V, chaque chemin d'exécution possible à travers chaque constructeur de C doit assigner V exactement une fois - ne pas assigner V ou affecter V deux fois ou plus entraînera une erreur.

Le mot clé readonly de C # n'a pas cette garantie - le compilateur est plus qu'heureux de laisser les membres de readonly non assignés ou vous permet de les assigner plusieurs fois dans un constructeur.

Donc, final et en lecture seule (au moins en ce qui concerne les variables membres) ne sont certainement pas équivalents - la finale est beaucoup plus stricte.


38
2018-05-07 18:45



Classe Java final et méthode finale -> scellée. Variable membre Java final -> readonly pour la constante d'exécution, const pour la constante de temps de compilation.

Pas d'équivalent pour la variable locale finale et l'argument de la méthode final


6
2017-08-25 11:20



Comme mentionné, sealed est un équivalent de final pour les méthodes et les classes.

Pour le reste, c'est compliqué.

  • Sur une constante (statique) définie dans la déclaration, const peut être considéré comme un équivalent, à condition qu'il s'agisse d'un type primitif ou d'une classe immuable.
  • Sur un champ qui ne devrait pas être réaffecté une fois qu'il quitte le constructeur, readonly peut être utilisé, mais ce n'est pas égal - final nécessite exactement une affectation même dans le constructeur.
  • Une variable locale supposée être affectée une seule fois ne peut pas être créée en C #, je suppose. Si vous vous demandez pourquoi quelqu'un en aurait-il besoin? Vous pouvez déclarer une variable avant un if-else, boîtier de commutation ou alors. En le déclarant comme final, vous appliquez qu'il est assigné exactement une fois, sinon, l'erreur du compilateur arrive. Cela nécessite un code correct, donc il y a moins d'erreurs.

En résumé, C # n'a pas d'équivalent direct de final. Tandis que Java manque de quelques fonctionnalités intéressantes de C #, il est rafraîchissant pour moi en tant que programmeur Java de voir où C # ne parvient pas à fournir un équivalent.


5
2018-02-19 09:05



http://en.csharp-online.net/CSharp_FAQ:_What_are_the_differences_between_CSharp_and_Java_constant_declarations

Les constantes C # sont déclarées en utilisant le mot-clé const pour les constantes de temps de compilation ou le mot-clé readonly pour les constantes d'exécution. La sémantique des constantes est la même dans les langages C # et Java.


4
2017-08-25 11:08



scellé


-1
2017-08-25 11:07