Visual Basic 入門

参照渡し・値渡し

LinkedInラーニングの無料トライアルを今すぐ試そう

無料で視聴する すべての加入プランを見る
このレッスンでは、関数の引数への渡し方として、非常に重要な概念である「参照渡し」と「値渡し」について説明します。
06:46

字幕

このレッスンでは、関数の引数への渡し方として非常に重要な概念である、参照渡しと値渡しについて説明します。始めにこちらのソースコードをご覧下さい。4行目から定義されているSwapInt 関数では2つの引数を取り、その関数の中で引数の値を入れ替える処理を行なっています。対して 11 行目から始まる関数では、2つの値を同様に取りますが引数の前に ByRef というキーワードが付いています。これはこの引数を参照渡しとして取るという事を意味しています。対して4行目の定義では何も付いていません。何も付いていない場合、もしくは Byval というキーワードが付いた場合、これはこの引数を値渡しで受け取る、という事を示しています。では実際に参照渡しと値渡しの違いを挙動を確認してみましょう。関数の呼び出し元ではまず、x と y をそれぞれ 10 ,20 を代入したものと定義し、SwapInt x, y およびSwapIntRef x, y の前後で値がどのように変化するかを見ています。では実際に実行してみましょう。実行すると、このような結果となりました。では始めに SwapInt 関数について見ていきましょう。 SwapInt 関数を実行する前は初期値の通り x は 10 、y は 20 となっています。この関数の中で Val1 とVal2 を置き換えた場合、関数の中では Val1 は 20、Val2 は 10 となります。しかし関数を呼び出した後、呼び出し元で再度値を確認するとx, y はそのままの10 , 20 となっており、値は入れ替わっていません。これは関数の引数に値渡しとして変数を渡した場合、変数が指す値のコピーが関数へと渡されるためです。対して SwapIntRef の場合はどうでしょうか。SwapIntRef を呼び出す前は、x の値は 10 、y の値は 20 となっています。SwapIntRef の中ではSwapInt と同様にして、Val1 と Val2 の値が入れ替わってはいますがSwapIntRef 関数を呼び出した後も、呼び出し元の x と y の値が入れ替わっています。ここが参照渡しと値渡しの大きな違いです。これは参照渡しでは、変数が指す値への参照が関数へと渡されるため、関数で値を変更すると、その呼び出し元の変数が指す値も、変更されるためです。では参照型の場合、どのような挙動をするのでしょうか。 実際に挙動を確認してみましょう。こちらのソースコードをご覧下さい。20 行目で宣言されているOperateIntArray 関数は2つの Integer 配列の引数を取り、まず1つ目の引数のInteger 配列に対して、その0番目の要素に1を代入しています。そして 22 行目では2つ目に取ったInteger 配列の引数に対して、新しく生成した Integer 配列の代入を行なっています。27 行目から始まるOperateIntArrayRef 関数でも同様な処理を行なっていますが、こちらは参照渡しとして、それぞれ2つの引数を渡しています。これらの関数の呼び出し元を見てみましょう。始めに 9,8,7,6,5,4 を持つそれぞれ配列 a, b を定義し、OperateIntArray a,bOperateIntArrayRef a, b を呼び出す前後のa の0番目の要素、b の要素をそれぞれ確認しています。ではこのコードを実行してみましょう。すると結果はこのようになりました。まず OperateIntArray 関数について見てみましょう。この関数を呼び出す前は、初期化時と同じ状況となっています。 この関数の中ではVal の0番目の要素を 1 へと変更、Val2 へは新しく生成したInteger 配列の代入を行なっています。関数の呼び出し後を確認してみると、a の0番目の要素の値は1 へと変化し、b の値は変化しないという結果となりました。これは値型の場合と同様に関数の引数に値渡しとして変数を渡した場合、変数が指す値のコピーが関数へと渡されるためです。参照型の変数が持つ値は、その実体への参照です。つまり関数へは参照のコピーが行なわれ、関数の中で引数へアクセスした場合、その参照先の実体へアクセスできる、という事となります。よって Val2 のような参照のコピーへ代入を行なっても、関数の呼び出し元の変数が持っている参照情報は変わりませんがVal1 のように変更が行われた場合、実体が直接変更されるため、関数の呼び出し元からも変更が確認できるという事となります。対して OperateIntArrayRef 関数はどうでしょうか。この関数を呼び出す前、a の 0 はOpertateIntArray の影響によって 1 でした。また b は変わっていませんので、6,5,4 です。この関数を呼び出した時点でこの関数内では-2,-1,-2,-3 のように変化しました。 またこの関数を呼び出した後呼び出し元で a, b の値をそれぞれ確認すると、関数内と同様 -2, -1, -2, -3 のように変化していました。これは参照渡しでは、変数が指す値への参照が関数へと渡されるためa の 0 番目の要素が変わるのは、先程と同様の理由ですがb の値が変わるのは、呼び出し元の b への参照が関数へと渡されたためです。つまり関数内で Val2 への代入を行なうということは、呼び出し元変数 b への参照に対して代入を行なうことと同義です。よって呼び出し元の b の値も変化しました。参照渡しと値渡し、渡す引数の型によって異なる挙動をするように感じられるかもしれませんが、そのようなことはなく、どちらも同じ原理で動作しています。非常に難しい部分ではありますが、ぜひ理解するようにしましょう。このレッスンでは、関数の引数への渡し方として非常に重要な概念である参照渡しと値渡しについて説明しました。

Visual Basic 入門

Visual Basicはプログラミング初心者にも比較的親しみやすい構文を採用したプログラミング言語です。従来のデスクトップアプリから最新フレームワークを用いたアプリまで、簡単に幅広く開発できます。このコースでは基本的な文法やクラス・名前空間などのより高度な機能、LINQなどVisual Basicを使ううえで必要な知識をひと通り学びます。

2時間53分 (43 ビデオ)
現在、カスタマーレビューはありません…
ソフトウェア・トピック
Visual Basic Visual Basic 2015
プラン加入者限定
発売日:2017年01月03日

このコースは、「オンデマンド」でご利用可能であり、ダウンロードすることもオンラインで見ることもできます。

ダウンロードすると、オフラインでコースを使用し、豊富なインターフェースをフルに活用できます。複数のデバイスを使用したり、 一度に全コースをダウンロードしたくない場合は、アカントにログインして、ストリーミング・ビデオとしてコースのレッスンを視聴してください。

ビデオトレーニングをお楽しみいただけますように! お問い合わせは、cs-jp@lynda.com宛までご連絡ください。