Quel est l'équivalent de la finale de Java en C#?
7 réponses
Le final
mot a plusieurs usages en Java. Il correspond à la fois à l'sealed
et readonly
les mots clés de C#, en fonction du contexte dans lequel il est utilisé.
Les 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êche le remplacement 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 ici 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 n'avez besoin que d'utiliser le mot clé sealed
en C# si vous voulez arrêter de remplacer une méthode qui a été explicitement marquée virtual
dans la classe de base.
Variables
Pour autoriser uniquement une variable attribué une fois:
Java
public final double pi = 3.14; // essentially a constant
C#
public readonly double pi = 3.14; // essentially a constant
Comme note de côté, l'effet du mot clé readonly
diffère de celui du const
mot clé en ce que l'expression readonly
est évaluée à runtime plutôt que compile-time , permettant ainsi des expressions arbitraires.
Cela dépend du contexte.
- pour une classe ou une méthode
final
, l'équivalent C # estsealed
. - pour un champ
final
, l'équivalent C # estreadonly
. - pour une variable locale
final
ou un paramètre de méthode, il n'y a pas d'équivalent direct C#.
Ce qui manque à tout le monde ici, C'est la garantie de Java d'une affectation définie pour les variables membres finales.
Pour une Classe C avec la variable de membre finale V, chaque chemin d'exécution possible à travers chaque constructeur de C doit assigner V exactement une fois-ne pas attribuer V ou assigner V deux fois ou plus entraînera une erreur.
Le mot-clé readonly de C#n'a pas une telle garantie-le compilateur est plus qu'heureux de laisser les membres readonly non affectés ou de vous permettre de les assigner plusieurs fois à l'intérieur d'un constructeur.
Donc, final et readonly (au moins en ce qui concerne les variables membres) ne sont certainement pas équivalents - final est beaucoup plus strict.
Classe Java finale et la méthode de finale -> scellé. Variable membre Java final - > readonly pour la constante d'exécution, const pour la constante de compilation.
Pas d'équivalent pour la Variable locale final et l'argument de méthode final
, 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 il n'est pas égal -final
nécessite exactement une affectation même dans le constructeur. - un local la variable qui est supposée être assignée une seule fois ne peut pas être créée en C#, je suppose. Si vous vous demandez pourquoi quelqu'un en aurait besoin: vous pouvez déclarer une variable avant if-else, Switch-case ou plus. En le déclarant comme final, vous appliquez qu'il est assigné exactement une fois, sinon, l'erreur du compilateur se produit. Cela nécessite un code bien élevé, donc il y a moins d'erreurs.
En résumé, C# n'a pas d'équivalent direct de final
. Bien que Java manque de fonctionnalités intéressantes de C#, il est rafraîchissant pour moi en tant que programmeur Java pour voir où C# ne parvient pas à fournir un équivalent.
Les constantes C # sont déclarées en utilisant le mot-clé const pour les constantes 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.