C# readonly vs Java final
En Java, final
signifie qu'une variable ne peut être attribué que pour une fois, mais cette affectation peut se produire n'importe où dans le programme. En C#, readonly
signifie un champ ne peut être attribué dans une constructeur, qui, de l'OMI, est beaucoup moins utiles.
Comme nous le savons tous, C# a été fortement influencée par le dessin Java, mais cette différence m'a toujours laissé perplexe comme étant très bizarre. Personne ne sait si il y a un raison technique dans le CLR, qui a entraîné la moins utile comportement de C#'s readonly
vs Java final
?
EDIT:
En réponse aux commentaires, je tiens à souligner que je suis bien conscient des avantages de l'immuabilité, et je l'utilise tous sur la place. Je crois readonly
est moins utile que Java à cause de cela:
public class Foo
{
private readonly int _bar;
Foo()
{
_bar = 5;
}
}
Oups, j'ai réellement besoin d'initialiser cette valeur dans une méthode d'aide!
public class Foo
{
private readonly int _bar;
Foo()
{
initialize()
}
private void initialize()
{
_bar = 5; //Can't compile because of semantics of readonly
}
}
Quels sont les avantages de l'immuabilité? Je pense que vous trouverez
readonly
peut être considérablement utile pour le compilateur. Vous question est par nature subjectif.Vous ne pouvez pas assing valeur finale varible n'importe où dans le programme en java. Si vous faites une statique de la finale de la constante alors vous avez besoin de donner de la valeur sur le spot sinon, si vous faites variable comme une finale, alors vous pouvez vous lancer dans le constructeur.
Il n'est pas un doublon. Il n'est pas demandé sur le l'équivalent de Java finale en C#. Il montre qu'il sait déjà. Je pense que vous n'avez pas pris la peine de lire la question, que c'est complètement différent.
Cette question est fondée sur un fausse prémisse que vous pouvez initialiser un final Java champ de n'importe où dans la classe. Vous ne pouvez pas faire cela! Le deuxième exemple n'est pas compilé en Java (à l'aide de final).
OriginalL'auteur MgSam | 2013-02-22
Vous devez vous connecter pour publier un commentaire.
Il est une raison technique pour le comportement de
readonly
: dans la création de l'assemblée des métadonnées le champ est marqué avec leinitonly
attribut qui assurera le champ n'est pas modifié à l'extérieur d'un constructeur.1 Cependant, alors que invérifiables, en prenant l'adresse de la lecture seule, il est toujours possible de modifier sa valeur. Vérifiable IL et C# ne vous permettra pas de le faire.Au moment de la compilation, il est impossible de faire valoir ce, pour toutes les méthodes, car le compilateur aurait pour analyser tous les ordres possibles dans les méthodes pourrait être appelé. À l'exécution, il serait probablement un fardeau sur le CLR et négatif pour les performances si elle avait de vérifier chaque domaine d'écrire qu'il a été écrit avant. Au lieu de cela, il est plus sûr que le C# et le CLR il suffit de ne pas permettre le champ d'attribuer une valeur de n'importe où, sauf dans les soigneusement analysé la portée d'un constructeur.
À mon avis, cela n'est pas le
readonly
mot-clé moins valable. Je l'utilise toute la place pour les champs dont la valeur est fournie seulement par le constructeur (ex: création d'une liste, ou le stockage d'un argument du constructeur). C# vous assurer que je ne vais pas modifier le champ après que plus jamais, s'assurer que je ne peut pas accidentellement mis ànull
ou quoi que ce soit.1) Merci à Eric Lippert pour le rappeler.
Vous êtes les bienvenus!
Je vous remercie pour votre réponse. C'est bien que pas tout le monde cherche des excuses pour fermer choses.
Le premier paragraphe est faux. Vous pouvez modifier un champ en lecture seule via la Réflexion, à l'aide de seulement sûr, C# et vérifiables IL. Vous pouvez même changer la valeur de
string.Empty
de cette façon. Peut-être que tu voulais dire le code de confiance, qui est un tout autre concept de vérifiable IL. Code non fiable ne peut pas utiliser (plus de Réflexion, mais vérifiable IL peut.Vous avez raison, mais quand vous apportez la réflexion dans l'image, tous les paris sont éteints. Je ne l'ai pas mentionné car il n'est pas pertinent pour la question. Que fait mon premier paragraphe, mal, dans la plupart des incomplètes.
OriginalL'auteur Daniel Pelsmaeker