Back to Top

プログラムの覚書

Category: VB.NET

VB.NET

VB.NETストラクチャー(Structure)

構造体のストラクチャーについて説明します。

通常のクラスとの違いは通常のクラスが参照型であるのに対し、構造体が値型であることです。

ストラクチャーを定義するには

<属性> Structure <構造体名>
 <属性> <メンバー名> As <変数型名>
 :
End Structure

ストラクチャー例

Public Structure Person
    Implements IDisposable

    Private m_Name As String
    Private m_Age As Integer

    'Newで初期化された場合用のコンストラクタ
    Sub New(ByVal name As String, ByVal age As Integer)
            Me.m_Name = name
            Me.m_Age = age
    End Sub

    'IDisposableインターフェースの実装デストラクタ
    Public Sub Dispose() Implements System.IDisposable.Dispose
            Console.WriteLine("Disposeが呼び出された。")
    End Sub

    '名前を設定する
    Public Sub SetName(ByVal name As String)
        Me.m_Name = name
    End Sub

    '名前を取得する
    Public Function GetName() As String
        Return (Me.m_Name)
    End Function

    '年齢を設定する
    Public Property Age() As Integer
        Get
            Return m_Age
        End Get
        Set(ByVal value As Integer)
            m_Age = value
        End Set
    End Property

End Structure

通常のクラスの使い方とあまり変わりません。通常では、ストラクチャーを使うことはあまりないと思います。

固定長の配列として扱いたい場合などに使用します。

固定長で宣言する

StructLayoutを使用するためImports System, System.Runtime.InteropServicesを追加します。

必ずしもStructLayoutの設定はいらないのですが、メモリの確保の仕方が32bit,64bitなどの機械(OS)により異なります。
ので以下はバイト単位でメモリを確保したいので指定します。(通常ではバイト単位で連続に確保されない)

Imports System, System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, Pack:=1)>
Friend Structure Person
    <VBFixedArray(20 - 1)> Public Name() As Byte
    <VBFixedArray(2 - 1)> Public Age() As Byte
End Structure

LayoutKind列挙体は、アンマネージ コードにエクスポートするときにオブジェクトのレイアウトを制御します。

 

VB.NET列挙体(Enum)

Enum(列挙子)の基本的な使い方を説明します。

列挙体のメンバの値(整数値のみ)や名前を列挙するクラスです。

列挙体を定義するにはEnum ~ End Enum

何も宣言しなければデフォルトでInt32型となり、宣言した順に0から値が振られます。

Enum DayWeek
    Sunday
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
End Enum

内部の型や値を指定することも可能です。

下記ではUInteger型となり、宣言した順に1から値が振られます。

Enum DayWeek As UShort
    Sunday = 1
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
End Enum

<Flags>属性を付けてビットフィールドとして扱う事もできます。

<Flags()>
Enum DayWeek As UShort
    Sunday = 1
    Monday = 2
    Tuesday = 4
    Wednesday = 8
    Thursday = 16
    Friday = 32
    Saturday = 64
End Enum

列挙体のメンバの値を列挙する

Dim val As DayWeek
For Each val In [Enum].GetValues(GetType(DayWeek))
    'メンバの名称と値を取得する
    Dim sName As String = [Enum].GetName(GetType(DayWeek), val)

    MessageBox.Show(sName & " " & CInt(val).ToString())
Next

'名前のみ
For Each DayName As String In [Enum].GetNames(GetType(DayWeek))
    MessageBox.Show(DayName)
Next

'値のみ
For Each v As UShort In [Enum].GetValues(GetType(DayWeek))
    MessageBox.Show(v.ToString())
Next

文字列からEnum値に変換する

Enum.Parseメソッド または Enum.TryParseメソッド を使用します。

' Enum.Parse()
Dim w As DayWeek = DirectCast([Enum].Parse(GetType(DayWeek), "Friday"), DayWeek)
Dim eName As String = [Enum].GetName(GetType(DayWeek), w)
MessageBox.Show(eName & " " & CInt(w).ToString())


'Enum.TryParse()
[Enum].TryParse(Of DayWeek)("Wednesday", w)
Dim sName2 As String = [Enum].GetName(GetType(DayWeek), w)
MessageBox.Show(sName2 & " " & CInt(w).ToString())