Quel est l'équivalent de final
en C # de Java?
Le mot clé final
a plusieurs utilisations en Java. Il correspond aux mots clés sealed
et readonly
en C #, en fonction du contexte dans lequel ils sont utilisés.
Pour éviter les sous-classes (héritage de la classe définie):
Java
public final class MyFinalClass {...}
C #
public sealed class MyFinalClass {...}
Empêcher le remplacement d'une méthode virtual
.
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 marque par défaut toutes les méthodes non statiques comme virtual
, alors que C # les marque comme sealed
. Par conséquent, vous ne devez utiliser le mot clé sealed
en C # que si vous souhaitez arrêter de redéfinir une méthode explicitement marquée virtual
dans la classe de base.
Pour n'autoriser qu'une variable à être assignée une fois:
Java
public final double pi = 3.14; // essentially a constant
C #
public readonly double pi = 3.14; // essentially a constant
Remarque: l'effet du mot clé readonly
diffère de celui du mot clé const
en ce que l'expression readonly
est évaluée à à l'exécution plutôt que compile-time , permettant ainsi des expressions arbitraires.
Ça dépend du contexte.
final
, le équivalent de C # est sealed
.final
, l'équivalent de C # est readonly
.final
, il n'existe pas d'équivalent direct en C #.Ce qui manque à tout le monde ici, c'est la garantie de Java concernant l'affectation définitive des variables de membre final.
Pour une classe C avec la variable membre finale V, chaque chemin d’exécution possible pour chaque constructeur de C doit attribuer V une seule fois - faute d’attribuer V ou d’attribuer V deux fois ou plus, une erreur se produira.
Le mot-clé readonly de C # n'a pas cette garantie - le compilateur est heureux de laisser les membres en lecture seule non attribués ou de vous permettre de les affecter plusieurs fois dans un constructeur.
Ainsi, final et readonly (du moins en ce qui concerne les variables membres) ne sont certainement pas équivalents - final est beaucoup plus strict.
Comme mentionné, sealed
est un équivalent de final
pour les méthodes et les classes.
Pour le reste, c'est compliqué.
Pour les champs static final
, static readonly
est la chose la plus proche possible. Cela vous permet d'initialiser le champ statique dans un constructeur statique, ce qui est assez similaire à l'initialiseur statique en Java. Ceci s'applique aux constantes (primitives et objets immuables) et aux références constantes aux objets mutables.
Le modificateur const
est assez similaire pour les constantes, mais vous ne pouvez pas les définir dans un constructeur statique.
readonly
peut être utilisé. Il n'est pas égal cependant - final
nécessite exactement une affectation, même dans le constructeur ou l'initialiseur.Que je sache, il n'y a pas d'équivalent C # pour une variable locale final
. Si vous vous demandez pourquoi quelqu'un en aurait besoin: Vous pouvez déclarer une variable avant un if-else, switch-case ou plus. En le déclarant final, vous indiquez qu'il est attribué au plus une fois.
Les variables locales Java doivent généralement être affectées au moins une fois avant d'être lues. À moins que la branche ne saute avant la lecture de la valeur, une variable finale est affectée une seule fois. Tout cela est vérifié à la compilation. Cela nécessite du code bien comporté avec moins de marge d'erreur.
En résumé, C # n'a pas d'équivalent direct de final
. Bien que Java ne possède pas certaines fonctionnalités intéressantes de C #, cela me rafraîchit en tant que programmeur Java de voir où C # ne parvient pas à fournir un équivalent.
Classe Java finale et méthode finale -> scellée. Java variable de membre final -> en lecture seule pour la constante d'exécution, const pour la constante de temps de compilation.
Pas d'équivalent pour la variable locale final et l'argument de méthode final
Les constantes C # sont déclarées à l'aide du mot-clé const pour les constantes de compilation ou du mot-clé readonly pour les constantes d'exécution. La sémantique des constantes est la même dans les langages C # et Java.
scellé