http://www.dreamincode.net/forums/topic/135354-reference-types-value-types-byval-byref/の情報から、仕事を成し遂げるのに十分な知識があるかもしれません。ただし、「ローカル変数(およびおそらくクラス変数)の宣言ではByRefは必要ありません」という発言により、ここで混乱があるのではないかと思いました。
まず、上記の C++ の例でint x; int& foo = x;
は、「参照」の意味が混乱しています。私の C++ はあまり強力ではありませんが、意味的に言えば、この C++ リファレンスはエイリアシング メカニズムのように機能すると思います。VB (および C#) では、参照はメモリ内のクラスのインスタンスを特定する識別コードのように機能します。VB にも C# にも、C++ 参照型のようなものはありません。
フォームを ByVal パラメーターとして渡し、そのプロパティとフィールドを問題なく変更できることは既にご存じでしょう。(ByVal は VB.NET の既定値であるため、これを使用する必要さえありません。VB6 では ByRef が既定値でした)。しかし、ええ、.NET 参照変数の場合、次のように仮定します。
Dim objA as New MyClass()
Dim objB as MyClass = objA
次に、objA と objB の両方が MyClass のまったく同じインスタンスを参照します。objA と objB を介して変更でき、objA または objB から読み取ることができます。これは、それぞれがまったく同じインスタンスに影響を与えるためです。objA または objB のいずれかをサブルーチン Foo にパラメータ objC As Object passed ByVal (つまりSub Foo(ByVal objC As Object)
) で渡すことができ、Foo は同じインスタンスを変更することもできます。
ByRef
VB の およびC ref
# の は、変更可能なパラメーターを示します。これは、値の代わりに何らかの「識別コード」参照が渡されることを意味します。それでも、この ByVal と ByRef のことは泥のように明らかです。.NET では、「値」型と「参照」型が区別され、ByRef
orref
が必要かどうかで多くの人が混乱するからです。
Visual Basic と C# は、変数 (およびデータ型) を「値」(または「構造」) と「参照」(または「クラス」) の 2 種類に二分します。
「値」タイプは、整数、ブール値、ビットマップ、またはその他の種類のオブジェクトを表すビットの実際のコレクションを意味します。古い学校の用語では、これはオブジェクトのインスタンス化の「イメージ」です。オブジェクトの状態空間です。それは、メモリ内のどこにあるかに関係なく、オブジェクトを本質的にそれ自体にするものです。
「参照」型とは、オブジェクトのデータ型とメモリ内の場所を何らかの形で示すコード (整数またはポインターのように見える) を意味します。コンピュータは「リファレンス」を解釈して、オブジェクトの実際のイメージ (つまり、その「値」) を取得します。
「値」パラメーターが渡さByVal
れると、渡される元の式と同じイメージである新しいオブジェクトが作成され、関数またはメソッドが動作するのはこのコピー上にあることを意味します。「Value」の元のイメージに影響を与えることはできません。
「値」パラメーターが渡さByRef
れると、新しい「参照」変数が作成され、その「参照」変数には、元の「値」のイメージに解釈される情報が含まれます。「値」の元のイメージを変更できるようになりました。
「参照」パラメーターが渡さByVal
れると、その「識別コード」がオブジェクトの実際の画像に解釈されてコピーされます。関数、サブルーチン、またはメソッドが動作するのは、このコードのコピーに対してです。このコピーは、まだオブジェクトの実際の画像を指しています。つまり、渡された Reference 変数のオブジェクトは、ByVal
そのイメージ (つまり、「値」) を変更することができます。ただし、元の「参照」自体のコードを変更することはできません。
(String 型は奇妙なダックであることに注意してください。実際には「参照」型であっても、「値」パラメータであるかのように動作します。したがって、ByVal で渡された String は、他の型と同じようには影響を受けません。実際、String は不変型の例です - つまり、その「値」が変更されないようにするための措置が講じられています。)
「参照」パラメーターが渡さByRef
れると、元の「参照」オブジェクトを指す新しい「参照」オブジェクトが作成されます (これは、「識別コード」を介して他のオブジェクトの「値」を指します)。 )。「参照」で を使用するByRef
と、パラメータとして渡される元の「参照」オブジェクトの「識別コード」を変更 (または新しく作成) できます。スワップ操作を実行する関数、サブルーチン、またはメソッドは、「参照」パラメーターで ByRef を使用します。