Je cherche l'équivalent de final
en Java en C#. Est-ce que ça existe?
Est-ce que C# a quelque chose comme ce qui suit:
public Foo(final int bar);
Dans l'exemple ci-dessus, bar
est une variable en lecture seule et ne peut pas être modifiée par Foo()
. Est-il possible de faire la même chose en C#?
Par exemple, peut-être que j'ai une longue méthode qui va travailler avec les coordonnées x
, y
et z
d'un objet (des entiers). Je veux être absolument certain que la fonction ne modifie pas ces valeurs d'une manière qui corromprait les données. Ainsi, je voudrais les déclarer en lecture seule.
public Foo(int x, int y, int z) {
// faire des trucs
x++; // oups. Cela corrompt les données. Est-ce que cela peut être capté au moment de la compilation?
// faire plus de trucs, en supposant que x est toujours la valeur initiale.
}
0 votes
Copie de stackoverflow.com/questions/2125591/… (et a une excellente réponse d'Eric Lippert, au fait)
12 votes
Je ne pense pas que ce soit un duplicata exact. Cette question concerne la différence entre la transmission par référence et la transmission par valeur. Je pense que Rosarch a peut-être utilisé un mauvais exemple de code pour le point qu'il essayait de faire passer.
0 votes
@Rosarch: De ce que je comprends du mot "final", c'est que vous ne pouvez plus agir sur l'objet, quel qu'il soit. Je comprends que "final" appliqué à une classe serait l'équivalent de "sealed" en C#. Mais quel est l'avantage ou l'utilisation réelle de ce mot-clé "final" de toute façon? Je l'ai presque toujours vu quelque part dans un code source JAVA.
3 votes
@Will Marcouiller Avec le mot clé final, ce n'est pas l'objet qui ne peut pas changer, car vous pouvez utiliser des méthodes qui changent en interne de l'objet, c'est la référence à l'objet qui ne peut pas changer. Dans le cas d'une situation de passage par valeur, comme l'exemple qui a été donné, cela empêcherait x++ d'être une opération valide car la valeur serait en train de changer. L'avantage serait que vous obtenez une vérification de cohérence à la compilation pour vous assurer que rien ne change la valeur. Cependant, dans mon expérience, je n'ai jamais eu besoin d'une telle fonctionnalité.
0 votes
+1 @Corey Sunwold: Merci pour cette précision. Pour l'instant, je connais seulement des similitudes entre C# et JAVA, sachant que C# a "hérité" de JAVA dans ses concepts. Cela dit, cela m'encourage à en apprendre davantage sur JAVA car je sais qu'il est largement répandu dans le monde entier.