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

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

506
demandé sur Stephen Kennedy 2009-08-25 15:05:43

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.

794
répondu Noldorin 2017-07-14 16:50:38

Cela dépend du contexte.

  • pour une classe ou une méthode final, l'équivalent C # est sealed.
  • pour un champ final, l'équivalent C # est readonly.
  • pour une variable locale final ou un paramètre de méthode, il n'y a pas d'équivalent direct C#.
159
répondu LukeH 2009-08-25 11:37:40

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.

38
répondu Some guy 2010-05-07 18:45:41

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

6
répondu Vijayakumarpl 2009-08-25 11:30:17

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

5
répondu Vlasec 2015-02-19 09:05:51

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 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
répondu Krzysztof Krasoń 2009-08-25 11:08:28

Scellé

0
répondu x2. 2009-08-25 11:07:05