web-dev-qa-db-ja.com

ByVal / ByRefを示す必要がないのはなぜですか?

Visual Studio 2010 Service Pack(Windows Updateで提案)をインストールしました。VB.NETでFunctionまたはSubを書き込むと、「intellisense」に新機能が表示されますByRefまたはByVal...でパラメーターを自動補完しません。

1)とにかく、このオプションを以前の状態に戻すことができますか?

2)ByXを指定しない場合、デフォルトでどちらが使用されますか? (常にByRefのようです)

31
Yogurtu

ティムはあなたが直接尋ねたものをカバーしましたが、値によって渡されたとしても、ユーザー定義クラスのような参照型変数は、残っているインスタンスプロパティなどに変更を加えることができることを覚えておいてください。ただし、オブジェクト全体を変更することはできません。参照によってデフォルトになっているように思われた理由かもしれません

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

から [〜#〜] msdn [〜#〜]

参照型の値は、メモリ内の他の場所にあるデータへのポインタです。つまり、参照型を値で渡すと、基になる要素自体にアクセスできない場合でも、プロシージャコードには基になる要素のデータへのポインターが含まれます。たとえば、要素が配列変数の場合、プロシージャコードは変数自体にはアクセスできませんが、配列のメンバーにはアクセスできます。

17
Jay

この投稿はあなたの質問をカバーしているようです:

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

ですから、古い行動をとる方法はありません。今後はByValがデフォルト(以前のバージョン)になり、メソッドのパラメーターに自動的に追加されなくなります。

私の意見では、これはVB.NETをC#との整合性を高め、不要な「ノイズ」を回避しているため(これは既に十分詳細です)、適切な決定です。

古い行動:

Private Sub test(ByVal test As String)
End Sub

新しい行動

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

ルーチンをVBAに転送する場合は注意してください。デフォルトはByRefです(たとえば、 このページの下部 にある「パラメーターを渡すデフォルトの方法」==、偉大なチップピアソンによる)。 。面倒なこともあります。

13
sancho.s