VB.NETの構造体の使い方は?クラスとの違いやサンプルも解説!

「VB.NETの構造体の使い方がよくわからない……」
「具体的な使い方だけでなく、クラスとの違いも知りたいな……」
と思っていませんか?
VB.NETの構造体は、クラス同様覚えておくととても便利です。ただ、使い方が分かりにくく、初めて使う人は苦戦する人が多いです。
そこで今回は、VB.NETの構造体の使い方やサンプルコードについて解説します。クラスとの違いについても解説しているので、ぜひ参考にしてみてくださいね!
- プログラマー
- VB.NETの構造体って難しそう……。
- システム
エンジニア - 難しく感じるかもしれませんが、一度使えばすぐに覚えられますよ!
※この記事は、Visual Basicの16.0で動作確認しました。
VB.NETの構造体の使い方は?サンプルコードも紹介!
まず、VB.NETの構造体の使い方について解説します。使い方1つとっても色々あるので、以下3つに分けて解説しますね。
・構造体の宣言・初期化方法
・構造体の値の取得・利用方法
・構造体のコピー方法
1つずつ詳しく解説しますね。
構造体の宣言・初期化方法
まず、「構造体の宣言・初期化方法」について学んでいきましょう。
構造体を使う上での基礎となるので、しっかり使い方を覚えていきましょう。
使い方は、以下のとおりです。
※下記は、構造体内の変数が2つある場合の書き方です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
Private Structure 構造体名
Public 変数1の変数名 As 変数1の型
Public 変数2の変数名 As 変数2の型
Public Sub set構造体名(ByVal 変数3の変数名 As 変数1と同じ型, ByVal 変数3の変数名 As 変数2と同じ型)
変数1 = 変数3
変数2 = 変数4
End Sub
End Structure
Shared Sub Main(args As String())
'ファイルのパスを変数に格納
Dim 構造体を格納する変数の変数名 As 構造体名
構造体を格納する変数.set構造体名(変数1に入れる値, 変数2に入れる値)
End Sub
|
「Private Structure 構造体名 ~ End Structure」までの間で、構造体を定義しています。
構造体はただ変数を用意するだけでなく、値をセットするメソッドを用意するのが一般的です。そのため、「set構造体名」の名前で、変数に値をセットするメソッドも用意しています。
ただこれだけだと、使い方のイメージが湧かない方もいるのではないでしょうか。具体的な使い方を解説するために、サンプルコードを用意しました。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
Private Structure Users
Public UserID As String
Public Name As String
Public Age As Integer
Public Sub setUsers(ByVal setVal1 As String, ByVal setVal2 As String, ByVal setVal3 As Integer)
UserID = setVal1
Name = setVal2
Age = setVal3
End Sub
End Structure
Shared Sub Main(args As String())
'構造体を宣言し、初期化
Dim sUsers As Users
sUsers.setUsers("A0001", "テストユーザ1", 24)
End Sub
|
「Private Structure Users ~ End Structure」の中で、構造体名「Users」の定義をしています。Usersの中では、UserID、Name、Ageの3つの変数と、値をセットするためのメソッド「setUsers」を用意しています。
実際に構造体を利用するときは、Mainメソッドで「Dim sUsers As Users」のように宣言しています。宣言後、初期化するために「sUsers.setUsers(“A0001”, “テストユーザ1”, 24)」を書いています。
「sUsers.setUsers(“A0001”, “テストユーザ1”, 24)」では、UserIDに「A0001」、Nameに「テストユーザ」、Ageに「24」を入れています。
構造体の値の取得・利用方法
次に、宣言した構造体の値を取得して利用する方法を覚えていきましょう。
先ほど宣言した構造体を使って、以下のように値を利用できます。
使い方:
1
|
構造体名.構造体の変数名
|
先ほど解説したサンプルに追記したサンプルコードは、以下のとおりです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
Private Structure Users
Public UserID As String
Public Name As String
Public Age As Integer
Public Sub setUsers(ByVal setVal1 As String, ByVal setVal2 As String, ByVal setVal3 As Integer)
UserID = setVal1
Name = setVal2
Age = setVal3
End Sub
End Structure
Shared Sub Main(args As String())
'構造体を宣言し、初期化
Dim sUsers As Users
sUsers.setUsers("A0001", "テストユーザ1", 24)
'構造体の値をログに出力
Console.WriteLine("UserID:" & sUsers.UserID)
Console.WriteLine("Name:" & sUsers.Name)
Console.WriteLine("Age:" & sUsers.UserID)
End Sub
|
実行結果:
初期化時にセットした値が、「sUsers.UserID」「sUsers.Name」「sUsers.Age」でそれぞれ取得できていますよね。
このように、セットした値を取得し、簡単に利用できます。
構造体のコピー方法
構造体は宣言・初期化 + 値の取得・利用方法がわかれば利用できます。ただ、構造体を使った変数を複数用意したいケースはよくあります。
そのため、構造体のコピー方法も覚えておきましょう。
コピー方法は、以下のとおりです。
使い方:
1
|
Dim 構造体2の変数名 = 構造体1の変数名(初期化済み)
|
こちらも、先ほどのサンプルコードを用意しました。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
Private Structure Users
Public UserID As String
Public Name As String
Public Age As Integer
Public Sub setUsers(ByVal setVal1 As String, ByVal setVal2 As String, ByVal setVal3 As Integer)
UserID = setVal1
Name = setVal2
Age = setVal3
End Sub
End Structure
Shared Sub Main(args As String())
'構造体を宣言し、初期化
Dim sUsers1 As Users
Dim sUsers2 As Users
sUsers1.setUsers("A0001", "テストユーザ1", 24)
'構造体をコピー
sUsers2 = sUsers1
'構造体の値をログに出力
Console.WriteLine("sUsers1.UserID:" & sUsers1.UserID)
Console.WriteLine("sUsers1.Name:" & sUsers1.Name)
Console.WriteLine("sUsers1.Age:" & sUsers1.UserID)
Console.WriteLine("sUsers2.UserID:" & sUsers2.UserID)
Console.WriteLine("sUsers2.Name:" & sUsers2.Name)
Console.WriteLine("sUsers2.Age:" & sUsers2.UserID)
End Sub
|
実行結果:
「sUsers1.setUsers(“A0001”, “テストユーザ1”, 24)」で、構造体の変数「sUsers1」に初期値をセットしています。
その後、「sUsers2 = sUsers1」で構造体をコピーすることで、「sUsers1」「sUsers2」の結果が同じになっています。このように、簡単に値をコピーできます。
VB.NETの構造体とクラスの違いは?
- システム
エンジニア - 構造体はクラスと似ているけど、違いはあるのかな…。
- プロジェクト
マネージャー - サンプルコードのような使い方だけであれば、あまり違いはありません。ただ、細かいところでいくつか違いがあります!
VB.NET以外の言語を使ったことがある場合、クラスとの違いがよくわからない人も多いのではないでしょうか。
構造体とクラスの違いは、以下のとおりです。
■構造体
・値型
・小規模のデータであれば、処理が早い
・継承、イベントなどができない
■クラス
・参照型
・大規模なデータの場合は、処理が早い
・継承、イベントなどができる
大きな違いは、構造体が「値型」で、クラスが「参照型」である点です。
1つのみ宣言して扱う場合は違いがありませんが、複数宣言して使う場合、結果が変わります。たとえば、コピーした構造体の変数を変更した場合は、以下のようになります。
構造体のサンプル:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
Private Structure Users
Public UserID As String
Public Name As String
Public Age As Integer
Public Sub setUsers(ByVal setVal1 As String, ByVal setVal2 As String, ByVal setVal3 As Integer)
UserID = setVal1
Name = setVal2
Age = setVal3
End Sub
End Structure
Shared Sub Main(args As String())
'構造体を宣言し、初期化
Dim sUsers1 As Users
Dim sUsers2 As Users
sUsers1.setUsers("A0001", "テストユーザ1", 24)
'構造体をコピー
sUsers2 = sUsers1
'コピーした構造体の値の一部を変更
sUsers2.UserID = "変更したID"
'構造体の値をログに出力
Console.WriteLine("sUsers1.UserID:" & sUsers1.UserID)
Console.WriteLine("sUsers1.Name:" & sUsers1.Name)
Console.WriteLine("sUsers1.Age:" & sUsers1.UserID)
Console.WriteLine("sUsers2.UserID:" & sUsers2.UserID)
Console.WriteLine("sUsers2.Name:" & sUsers2.Name)
Console.WriteLine("sUsers2.Age:" & sUsers2.UserID)
End Sub
|
実行結果:
この例では、コピー後の構造体「sUsers2」のUserIDを変更しています。そのため、「sUsers1」のUserIDは初期化の値から変わっていません。
ただ、クラスの場合は、以下のようになってしまいます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
Public Class classUsers
Public UserID As String
Public Name As String
Public Age As Integer
Public Sub setUsers(ByVal setVal1 As String, ByVal setVal2 As String, ByVal setVal3 As Integer)
UserID = setVal1
Name = setVal2
Age = setVal3
End Sub
End Class
Public Class Class1
Shared Sub Main(args As String())
'構造体を宣言し、初期化
Dim cUsers1 As New classUsers()
Dim cUsers2 As New classUsers()
cUsers1.setUsers("A0001", "テストユーザ1", 24)
'構造体をコピー
cUsers2 = cUsers1
'コピーした構造体の値の一部を変更
cUsers2.UserID = "変更したID"
'構造体の値をログに出力
Console.WriteLine("sUsers1.UserID:" & cUsers2.UserID)
Console.WriteLine("sUsers1.Name:" & cUsers2.Name)
Console.WriteLine("sUsers1.Age:" & cUsers2.UserID)
Console.WriteLine("sUsers2.UserID:" & cUsers2.UserID)
Console.WriteLine("sUsers2.Name:" & cUsers2.Name)
Console.WriteLine("sUsers2.Age:" & cUsers2.UserID)
End Sub
End Class
|
実行結果:
クラス名が「cUsers2」の「UserID」のみ変えていますが、クラス名「cUsers1」の「UserID」の値も変わっています。このように、コピーして使用した際の動きが違うのです。
また、構造体の場合は、設定する変数の数が多ければ多いほど処理に時間がかかります。そのため処理速度が遅いと感じたら、クラスへの変更を考えてみると良いでしょう。
VB.NETで構造体以外に複数データを扱う方法はないの?
構造体は複数の型の変数をまとめて利用できるため、とても便利です。
ただ、「慣れるまで扱いにくい……」と感じる人は多いです。そのため、他の方法も覚えておくのがおすすめです。
具体的に言うと、以下2つは覚えておくと良いでしょう。
・配列
・Enum
配列は、変数宣言するだけで、複数の値を管理・利用できる方法です。ただし、型の指定が1つのみなので、複数の型で一括管理したい場合は構造体・クラスを使いましょう。
Enumは構造体のように、別途定義が必要です。また、数値しか扱うことができません。
その代わり、連続した値を簡単に設定ができるため、用途によってはとても便利です。
配列とEnumの使い方については、以下でそれぞれ解説しています。ぜひ参考にしてみてくださいね。
>>> 【VB.NET入門】配列の使い方全まとめ!基礎だけでなく応用も
>>> VB.NETのEnumの使い方は?基礎だけでなく応用テクも解説!
まとめ
今回は、VB.NETの構造体の使い方・サンプルコードについて解説しました。
構造体は複数の型の変数を管理・利用できるため、とても便利です。まずは簡単な構造体を作ってみて、慣れてきたらクラスや配列、Enumなどを学んでいくと良いでしょう。
簡単なコードからでいいので、ぜひコードを書いてみてくださいね!
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


新着案件New Job
-
開発エンジニア/東京都品川区/【WEB面談可】/在宅ワーク
月給29万~30万円東京都品川区(大崎駅) -
遠隔テストサービス機能改修/JavaScript/東京都港区/【WEB面談可】/テレワーク
月給45万~60万円東京都港区(六本木駅) -
病院内システムの不具合対応、保守/東京都豊島区/【WEB面談可】/テレワーク
月給30万~30万円東京都豊島区(池袋駅) -
開発/JavaScript/東京都豊島区/【WEB面談可】/テレワーク
月給50万~50万円東京都豊島区(大塚駅) -
債権債務システム追加開発/東京都文京区/【WEB面談可】/在宅勤務
月給62万~67万円東京都文京区(後楽園駅) -
PMO/東京都豊島区/【WEB面談可】/在宅勤務
月給55万~55万円東京都豊島区(池袋駅)