web-dev-qa-db-fra.com

Pourquoi n'est-il plus nécessaire d'indiquer ByVal / ByRef?

Je viens d'installer Visual Studio 2010 Service pack (proposé sur Windows Update), et je peux voir une nouvelle fonctionnalité sur "intellisense" qui signifie que lorsque j'écris un Function ou Sub dans VB.NET il ne complète pas automatiquement les paramètres avec ByRef ou ByVal...

1) Existe-t-il de toute façon que je peux reconfigurer cette option comme avant?

2) Si je ne spécifie pas ByX, lequel est utilisé par défaut? (il semble que ce soit toujours ByRef)

31
Yogurtu

Tim a couvert ce que vous avez demandé directement, mais autre chose à garder à l'esprit est que toute variable de type de référence, comme une classe définie par l'utilisateur, même si passée par valeur, vous permettra d'apporter des modifications aux propriétés des instances, etc. qui restent. Il ne vous permettra cependant pas de modifier l'intégralité de l'objet. C'est peut-être la raison pour laquelle il vous a semblé être par défaut par référence

Public Sub (Something As WhateverClass) 
  Something = New WhateverClass 'will result in no changes when outside this method

  Something.Property1 = "Test"  'will result in an updated property when outside this method
End Sub

De MSDN :

La valeur d'un type de référence est un pointeur vers les données ailleurs en mémoire. Cela signifie que lorsque vous transmettez un type de référence par valeur, le code de procédure a un pointeur vers les données de l'élément sous-jacent, même s'il ne peut pas accéder à l'élément sous-jacent lui-même. Par exemple, si l'élément est une variable de tableau, le code de procédure n'a pas accès à la variable elle-même, mais il peut accéder aux membres du tableau.

17
Jay

Il semble que ce message couvre votre question:

http://msmvps.com/blogs/carlosq/archive/2011/03/15/vs-2010-sp1-changing-quot-byval-quot-vb-net-code-editor-experience.aspx

Donc non, il n'y a aucun moyen d'obtenir l'ancien comportement. Désormais, ByVal est la valeur par défaut (ce qu'elle était auparavant) et elle ne sera pas ajoutée automatiquement aux paramètres de la méthode.

À mon avis, c'est une bonne décision car cela rend VB.NET un peu plus cohérent avec C # et évite les "bruits" inutiles (il est déjà assez verbeux).

Ancien comportement:

Private Sub test(ByVal test As String)
End Sub

Nouveau comportement

Private Sub test(test As String)
End Sub
44
Tim Schmelter

Méfiez-vous lors du transfert de routines vers VBA, où la valeur par défaut est ByRef (voir, par exemple, "La méthode par défaut de transmission des paramètres" à en bas de cette page , par le grand Chip Pearson) . Cela peut être compliqué.

13
sancho.s