web-dev-qa-db-fra.com

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

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

532
Nosrama

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.

Des classes

Pour éviter les sous-classes (héritage de la classe définie):

Java

public final class MyFinalClass {...}

C #

public sealed class MyFinalClass {...}

Les méthodes

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.

Variables

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.

831
Noldorin

Ça dépend du contexte.

169
LukeH

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.

42
Some guy

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.

  • Sur un champ qui ne devrait pas être réaffecté une fois qu'il a quitté le constructeur, 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.

7
Vlasec

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

6
Vijayakumarpl

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 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.

5
Krzysztof Krasoń

scellé

0
x2.