Comment "faire" ByVal en C#
Ce que je comprends, C# passe les paramètres dans les méthodes de référence. Dans VB.NET vous pouvez spécifier cette avec ByVal et ByRef. La valeur par défaut est ByVal.
Est-ce pour la compatibilité avec Visual Basic 6.0, ou est-ce un simple hasard? Aussi, comment puis-je spécifier les éléments à utiliser en C#? J'aime bien l'idée d'un passage de paramètres par valeur.
- Voir pobox.com/~skeet/csharp/parameters.html pour les détails de la configuration par défaut etc.
- Bonne réponse, Jon, mais vous êtes aussi une IA!
- En vb6, les paramètres ont été passés en tant que
ByRef
en l'absence de laByVal
mot-clé. Dans .net les langues, la valeur par défaut est par valeur. Afin de faciliter la migration et d'éviter la confusion, vb.net exige que les paramètres soient explicitement marquéByRef
ouByVal
, mais la VS éditeur de "s'auto-corriger" paramètres sans ce marquage par adjonction de", ByVal". Parce qu'il n'a jamais été C#-ish langue qui avait passé par-ref que le comportement par défaut, il n'y a aucun problème tout simplement en disant que non marquées sont les paramètres par valeur. - Merci @supercat pour l'histoire/contexte. Je me suis toujours demandé pourquoi j'avais explicitement état
ByVal
quand c'est ce que je voulais dire 99% du temps. Toujours pensé que c'était une sorte de silly - en connaissance de cause fait sentir un peu moins bête 😉 - Je trouve ça assez ironique de constater que, bien que la valeur par défaut-byref comportement de la transmission de paramètres dans VB/QBasic a longtemps été reconnu comme une erreur, les bouchons dans les deux VB6 et C# sont fait par référence "par défaut" [la seule façon de spécifier la valeur est de créer de nouvelles variables pour une utilisation par des fermetures]. Java permet uniquement par valeur, et nécessite fermé plus de variables pour être déclaré
final
; ma préférence serait d'exiger que fermé plus de variables soit marquéreadonly
[équivalent àfinal
] ou encore explicitement déclaré comme étant capturable par référence, mais je n'ai pas de conception les langues.
Vous devez vous connecter pour publier un commentaire.
Paramètres en C# sont, par par défaut passé par valeur. Il n'y a pas de modificateur pour faire de cette explicites, mais si vous ajoutez
ref
/out
le paramètre par référence.L'habituelle confusion ici, c'est la différence entre:
ref
partout, parce que je pensais que c'était le C# équivalent de passage d'un pointeur ;<Passage par valeur est la valeur par défaut en C#. Toutefois, si la variable passée est de type référence, puis vous passez à la référence en valeur. C'est peut-être l'origine de votre confusion.
En gros, si vous passez une référence par la valeur, alors vous pouvez changer l'objet qu'il désigne et ces changements vont persister en dehors de la méthode, mais vous ne pouvez pas faire de la variable de référence à un autre objet et le changement persistent en dehors de la méthode.
Paramètres en C# sont passés "ByVal" par défaut. Vous devez spécifier "ref" ou "out" si vous souhaitez comportement différent.