カテゴリ: VB.NET 更新日: 2026/02/07

VB.NETで引数を使う方法!ByValとByRefの違いを初心者向け解説

VB.NETで引数を使う方法(ByVal・ByRefの違い)
VB.NETで引数を使う方法(ByVal・ByRefの違い)

先生と生徒の会話形式で理解しよう

生徒

「先生、VB.NETでメソッドに値を渡すときにByValとByRefってどう違うんですか?」

先生

「ByValは『値渡し』で、ByRefは『参照渡し』です。簡単に言うと、ByValはコピーを渡すので元の値は変わらず、ByRefは直接変数を渡すので元の値も変更されます。」

生徒

「コピーと直接渡すって、どんなイメージですか?」

先生

「例えば、お菓子の箱を渡すと考えます。ByValは箱の中身を写真で送るようなもので、中身を変えても元の箱は変わりません。ByRefは箱そのものを渡すので、中身を変えると元の箱も変わります。」

1. ByVal(値渡し)の使い方

1. ByVal(値渡し)の使い方
1. ByVal(値渡し)の使い方

VB.NETでByValを使うと、引数のコピーをメソッドに渡します。メソッド内で値を変更しても、元の変数には影響しません。


Sub ChangeValueByVal(ByVal x As Integer)
    x = x + 10
    Console.WriteLine("メソッド内の値: " & x)
End Sub

Dim num As Integer = 5
ChangeValueByVal(num)
Console.WriteLine("元の値: " & num)

メソッド内の値: 15
元の値: 5

この例ではxの値はメソッド内で変わっていますが、numの値は変わりません。ByValは元の値を安全に保ちたいときに便利です。

2. ByRef(参照渡し)の使い方

2. ByRef(参照渡し)の使い方
2. ByRef(参照渡し)の使い方

ByRefを使うと、変数そのものを渡すため、メソッド内で値を変更すると元の変数も変わります。


Sub ChangeValueByRef(ByRef x As Integer)
    x = x + 10
    Console.WriteLine("メソッド内の値: " & x)
End Sub

Dim num As Integer = 5
ChangeValueByRef(num)
Console.WriteLine("元の値: " & num)

メソッド内の値: 15
元の値: 15

ByRefは、関数やSubから元の変数を直接変更したい場合に使います。例えばカウンタや集計値を更新する場合に便利です。

3. ByValとByRefを使い分けるポイント

3. ByValとByRefを使い分けるポイント
3. ByValとByRefを使い分けるポイント

どちらを使うかは「元の値を変更したいかどうか」で決めます。

  • 値を安全に渡したい場合はByVal
  • 元の変数を更新したい場合はByRef

また、FunctionやSubに複数の引数がある場合、ByValとByRefを組み合わせて使うこともできます。

4. 実用例:計算と値更新

4. 実用例:計算と値更新
4. 実用例:計算と値更新

例えば、VB.NETで合計値を計算して返す場合はFunctionでByValを使い、処理中に元の変数も更新したい場合はByRefを使うと便利です。


Function Add(ByVal a As Integer, ByVal b As Integer) As Integer
    Return a + b
End Function

Sub UpdateCounter(ByRef counter As Integer)
    counter += 1
End Sub

Dim total As Integer = Add(3, 7)
Console.WriteLine("合計: " & total)

Dim count As Integer = 0
UpdateCounter(count)
Console.WriteLine("カウント: " & count)

合計: 10
カウント: 1

このようにByValとByRefを適切に使い分けることで、VB.NETのメソッドはより安全で効率的に利用できます。

5. まとめると

5. まとめると
5. まとめると

VB.NETで引数を渡すときは、ByValByRefの違いを意識しましょう。値をコピーして渡す場合はByVal、元の変数を直接更新する場合はByRefを使います。初心者でもこの違いを理解すると、プログラムの挙動を正しく制御できます。

まとめ

まとめ
まとめ

ここまで、VB.NETにおける引数の渡し方である「ByVal(値渡し)」と「ByRef(参照渡し)」について詳しく解説してきました。プログラミングの学習を進めていく中で、メソッドや関数を自作する機会は非常に増えていきます。その際に、引数として渡したデータが呼び出し元でどのように扱われるかを正確に把握しておくことは、予期せぬバグを防ぐために極めて重要です。

値渡し(ByVal)の深い理解と注意点

VB.NETのデフォルトの挙動はByValです。これは、安全性を重視した設計と言えます。ByValを指定すると、メモリ上にある変数の「値そのもの」がコピーされてメソッドに送られます。そのため、メソッドの中でどんなに値を書き換えても、呼び出し元のオリジナルデータには一切影響を与えません。

例えば、計算処理を行う際に元の数値を保持しておきたい場合や、表示用の一時的な変換を行いたい場合にはByValが最適です。開発現場では、意図しない書き換え(副作用)を避けるために、基本的にはByValを使用することが推奨されます。

参照渡し(ByRef)を活用するケース

一方でByRefは、変数の「格納場所(アドレス)」を渡す仕組みです。メソッド内での操作が、そのまま呼び出し元の変数に反映されます。これは、一度の呼び出しで複数の結果を返したい場合や、大きな構造体などをコピーせずに効率よく扱いたい場合に利用されます。ただし、予期せず元の値が変わってしまうリスクがあるため、使用する際は明確な目的を持つことが大切です。

実践的なサンプルプログラム

より具体的な活用イメージを掴むために、商品の価格計算と在庫更新を行うシミュレーションコードを見てみましょう。


Module Module1
    Sub Main()
        ' 商品価格と在庫数の初期設定
        Dim price As Integer = 1000
        Dim stockCount As Integer = 50

        Console.WriteLine("--- 処理開始前 ---")
        Console.WriteLine("価格: " & price & "円")
        Console.WriteLine("在庫: " & stockCount & "個")

        ' 税込み価格の計算(ByValを使用)
        Dim taxIncluded As Integer = CalculateTax(price)
        
        ' 在庫の出荷処理(ByRefを使用して直接減らす)
        ShipProduct(stockCount, 3)

        Console.WriteLine("--- 処理完了後 ---")
        Console.WriteLine("計算後の税込み価格: " & taxIncluded & "円")
        Console.WriteLine("元の価格変数(不変): " & price & "円")
        Console.WriteLine("更新された在庫数: " & stockCount & "個")
        
        Console.ReadLine()
    End Sub

    ' ByVal: 元の価格は変えずに、計算結果だけを返す
    Function CalculateTax(ByVal targetPrice As Integer) As Integer
        targetPrice = CInt(targetPrice * 1.1) ' メソッド内で加工
        Return targetPrice
    End Function

    ' ByRef: 在庫数そのものを書き換える
    Sub ShipProduct(ByRef currentStock As Integer, ByVal shipAmount As Integer)
        If currentStock >= shipAmount Then
            currentStock -= shipAmount
            Console.WriteLine(shipAmount & "個出荷しました。")
        Else
            Console.WriteLine("在庫不足です。")
        End If
    End Sub
End Module

プログラムの実行結果


--- 処理開始前 ---
価格: 1000円
在庫: 50個
3個出荷しました。
--- 処理完了後 ---
計算後の税込み価格: 1100円
元の価格変数(不変): 1000円
更新された在庫数: 47個

このように、CalculateTax関数ではByValを使っているため、元のprice変数は1000円のまま維持されています。対してShipProductサブプロシージャではByRefを使っているため、stockCount変数の値が直接47個に更新されていることがわかります。

SEOの観点から見るVB.NETの引数設計

VB.NETのプログラミングにおいて、「引数 渡し方」「ByVal ByRef 違い」「VB.NET メソッド 引数」といったキーワードは頻繁に検索されます。効率的な開発を行うためには、メモリ管理の概念も重要です。値渡しはコピーを作成するため、非常に巨大なデータを扱う場合にはメモリ消費が気になる場面もありますが、現代のPCスペックでは通常の数値や文字列程度であれば全く気にする必要はありません。むしろ、コードの可読性と安全性を高めるために、デフォルトのByValを使いこなし、必要なときだけByRefを選択するというスタンスが、プロのエンジニアへの第一歩と言えるでしょう。

また、ASP.NETなどのウェブアプリケーション開発においても、これらの基本は共通です。サーバー側で実行されるロジックを組む際、変数のスコープ(有効範囲)と引数の渡し方を正しく理解していれば、データの整合性を保つ堅牢なシステムを構築することができます。

先生と生徒の振り返り会話

生徒

「先生、コードを書いてみてやっと実感が湧きました!ByValは元のデータを守るためのバリアみたいな役割なんですね。」

先生

「その通りです。プログラムが大きくなってくると、どこで変数の値が変わったのか分からなくなるのが一番怖いんです。だから、理由がない限りはByValを使うのが基本なんですよ。」

生徒

「逆にByRefを使うのは、複数の値を一気に書き換えたいときや、どうしても元の変数を直接いじりたいときだけ、という感じでしょうか?」

先生

「正解です。例えば、座標データを更新する処理や、在庫管理システムのように『実体』を操作する必要がある場合に有効ですね。ちなみに、VB.NETでは引数に何も書かないと自動的にByValとして扱われますが、明示的に書くことで読みやすいコードになります。」

生徒

「なるほど。明示的に書くことで、他の人がコードを見たときも『あ、これは値を守っているんだな』と一目で分かりますもんね。勉強になりました!」

先生

「素晴らしい気づきですね。その積み重ねが、バグの少ない綺麗なプログラムに繋がります。次は、クラスの中での参照型の扱いについても学んでいくと、さらに理解が深まりますよ。」

生徒

「はい、頑張ります!これからもVB.NETの基本をしっかり固めて、実践的なアプリ作りに挑戦していきたいです。」

カテゴリの一覧へ
新着記事
New1
ASP.NET
ASP.NET Web APIとMVCの違いを完全解説!初心者でもわかるWebアプリとAPIの基本
New2
ASP.NET
ASP.NET開発環境構築|コマンドライン(dotnet CLI)でASP.NETプロジェクトを作成する方法
New3
VB.NET
VB.NETで文字列を綺麗に整える!String.Formatと文字列補間の使い方
New4
ASP.NET
LinuxでASP.NET Coreを動かす手順|初心者でもわかる開発環境構築ガイド
人気記事
No.1
Java&Spring記事人気No1
VB.NET
VB.NETのJoinメソッドを徹底解説!バラバラの文字列を一つに結合する方法
No.2
Java&Spring記事人気No2
VB.NET
VB.NETの文字列置換を完全解説!初心者でもわかるReplaceメソッドの使い方
No.3
Java&Spring記事人気No3
VB.NET
VB.NETの配列(Array)の作り方と基本操作を徹底解説!初心者でもわかる入門ガイド
No.4
Java&Spring記事人気No4
VB.NET
VB.NETで文字列結合を高速化!StringBuilderクラスの使い方を完全ガイド
No.5
Java&Spring記事人気No5
VB.NET
VB.NETのList(Of T)の使い方を完全ガイド!初心者が最初に覚えるべきリスト操作
No.6
Java&Spring記事人気No6
VB.NET
VB.NETのDictionaryを完全ガイド!初心者でもわかる辞書の基本と応用
No.7
Java&Spring記事人気No7
VB.NET
VB.NETでStaticメソッドを定義する方法と活用例
No.8
Java&Spring記事人気No8
VB.NET
VB.NETのTrimで空白削除!初心者向け文字列整形完全ガイド