Quel est l'équivalent de Java final
en C #?
c#
access-modifiers
reserved-words
Nosrama
la source
la source
Réponses:
Le
final
mot-clé a plusieurs usages en Java. Il correspond à la fois aux mots cléssealed
etreadonly
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
C #
Les méthodes
Empêcher le remplacement d'une
virtual
méthode.Java
C #
Comme le souligne Joachim Sauer, une différence notable entre les deux langages ici est que Java par défaut marque toutes les méthodes non statiques comme
virtual
, tandis que C # les marque commesealed
. Par conséquent, vous n'avez besoin d'utiliser lesealed
mot clé en C # que si vous souhaitez arrêter de surcharger une méthode qui a été explicitement marquéevirtual
dans la classe de base.Variables
Pour autoriser une variable à être affectée une seule fois:
Java
C #
En remarque, l'effet du
readonly
mot - clé diffère de celui duconst
mot - clé dans la mesure où l'readonly
expression est évaluée au moment de l' exécution plutôt qu'au moment de la compilation , permettant ainsi des expressions arbitraires.la source
readonly
les variables membres peuvent être modifiées dans les constructeurs: pastebin.com/AzqzYGiAÇa dépend du contexte.
final
classe ou une méthode, l' équivalent C # estsealed
.final
champ, l' équivalent C # estreadonly
.final
variable locale ou un paramètre de méthode, il n'y a pas d'équivalent C # direct.la source
For a final local variable or method parameter, there's no direct C# equivalent
une énorme distinction.const
ne peut être utilisé que sur des types de valeur. Pour autant que je sache, il n'y a aucun moyen de faire une constante efficace pour un type de référence local.Ce que tout le monde manque ici, c'est la garantie de Java d'une affectation définitive pour les variables de membre final.
Pour une classe C avec la variable de membre final V, chaque chemin d'exécution possible à travers chaque constructeur de C doit assigner V une seule fois - faute d'attribuer V ou d'affecter V deux fois ou plus, une erreur se produira.
Le mot clé en lecture seule de C # n'a aucune garantie de ce type - le compilateur est plus qu'heureux de laisser les membres en lecture seule non affectés ou de vous permettre de les affecter plusieurs fois au sein d'un constructeur.
Ainsi, final et readonly (au moins en ce qui concerne les variables membres) ne sont certainement pas équivalents - final est beaucoup plus strict.
la source
Comme mentionné,
sealed
est un équivalent definal
pour les méthodes et les classes.Quant au reste, c'est compliqué.
Pour les
static final
champs,static readonly
c'est la chose la plus proche possible. Il vous permet d'initialiser le champ statique dans un constructeur statique, qui est assez similaire à l'initialiseur statique en Java. Cela s'applique à la fois aux constantes (primitives et objets immuables) et aux références constantes aux objets mutables.Le
const
modificateur est assez similaire pour les constantes, mais vous ne pouvez pas les définir dans un constructeur statique.readonly
peut être utilisé. Ce n'est pas égal cependant -final
nécessite exactement une affectation, même dans le constructeur ou l'initialiseur.Il n'y a pas d'équivalent C # pour une
final
variable locale à ma connaissance. Si vous vous demandez pourquoi quelqu'un en aurait besoin: vous pouvez déclarer une variable avant un if-else, un switch-case ou autre. En le déclarant définitif, vous faites en sorte qu'il soit attribué au plus une fois.Les variables locales Java en général doivent ê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 exactement une fois. Tout cela est vérifié au moment de la compilation. Cela nécessite un code bien comporté avec moins de marge d'erreur.
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, de voir où C # ne parvient pas à fournir un équivalent.la source
Classe Java finale et méthode finale -> scellées. Variable membre Java final -> en lecture seule pour la constante d'exécution, const pour la constante de temps de compilation.
Aucun équivalent pour la variable locale finale et l'argument de méthode final
la source
http://en.csharp-online.net/CSharp_FAQ:_What_are_the_differences_between_CSharp_and_Java_constant_declarations
Les constantes C # sont déclarées à l'aide du mot clé const pour les constantes de temps 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.
la source
scellé
la source