VB.NET基本メモ

昨日VBネタが出てきたので、いつの日か自分用に書いたメモを転記。

基本的には、Microsoft@ITから引用した内容だったと思います。

間違いあるかもしれません。

VBまとめ

命名規則

Microsoftから引用。

  • 名前の中の各単語を大文字で始める。

    • 例えば、FindLastRecodeRedrawMyFormのようにする。
  • 関数やメソッド名は動詞で始める。

    • 例えば、InitNameArrayCloseDialogのようにする。
  • クラス、構造体、モジュールやプロパティ名は名詞で始める。

    • 例えば、EmployeeNameCarAccessoryのようにする。
  • インターフェイス名はプレフィックス"I"を付けて始め、後に名詞、名詞句を続ける。

    • 例えば、IComponentなど。
    • インターフェイスの動作を説明する形容詞を続ける場合もあり。 例えば、IPersistableなど。

データ型

タイプ サイズ 格納できる値の範囲
数値型 整数型 SByte 1バイト -128~127(符号付き)
Byte 1バイト 0~255(符号なし)
Short 2バイト -32,768~32,767(符号付き)
UShort 2バイト 0 ~ 65,535 (符号なし)
Integer 4バイト -2,147,483,648 ~ 2,147,483,647 (符号付き)
UInteger 4バイト 0 ~ 4,294,967,295 (符号なし)
Long 8バイト -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 (9.2...E+18 †) (符号付き)
ULong 8バイト 0 ~ 18,446,744,073,709,551,615 (1.8...E+19 †) (符号なし)
浮動小数点型 Single 4バイト ±3.40282347E+38~±1.40239846E-45
Double 8バイト ±1.79769313486231570E+308 ~ ±4.94065645841246544E-324
10進型 Decimal 16バイト 0 ~ +/-79,228,162,514,264,337,593,543,950,335 (+/-7.9...E+28) † (小数点なし)
0 ~ +/-7.9228162514264337593543950335 (小数点以下 28 桁)
0 以外の最小数は +/-0.0000000000000000000000000001 (+/-1E-28) †
論理型 Boolean ※1 true または false
日付型 Date 8バイト 0001 年 1 月 1 日 0:00:00 (午前 0 時) ~ 9999 年 12 月 31 日 11:59:59 PM
文字型 Char 2バイト 0~65535 (符号なし)
String ※1 0個~約20億個のUnicode文字
Object型 Object ※2 任意の型を格納可能

※1 実装するプラットフォームに依存。

※2 32ビットプラットフォームでは4バイト/64ビットプラットフォームでは8バイト。

コレクション

コレクションとは、同じ型のデータをまとめて管理するためのデータ構造を総称したもの。

Visual Basic 2005からは、System.Collections.Generic名前空間で、ジェネリックを使ったコレクションクラスが提供されている。

ジェネリック:クラスやメソッドのパラメータにおいて、処理対象とするデータ型を特定することなく汎用的な形で記述できるしくみ。

コレクションの種類
(アルゴリズムによる分類)
System.Collections System.Collections.Generic
リスト ArrayList List
双方向連結リスト LinkedList
ソート済みリスト SortedList SortedList
スタック Stack Stack
キュー Queue Queue
ハッシュテーブル Hashtable Dictionary
二分探索木 SortedDictionary

コレクションクラスの主要なプロパティとメソッド

コレクション名 プロパティ・メソッド 概要
List Count 実際に格納されている要素の数を返す
Add(item) 末尾にオブジェクトを追加する
Clear() すべての要素を削除する
Insert(index,item) 指定したインデックスの位置に要素を挿入する
Remove(item) 最初に見つかった特定のオブジェクトを削除する
Stack Count 格納されている要素の数を返す
Contains(item) ある要素がスタック内に存在するかを判断する
Peek() 先頭にあるオブジェクトを削除せずに返す
Pop() 先頭にあるオブジェクトを削除し、返す
Push(item) 先頭にオブジェクトを挿入する
Queue Count 格納されている要素の数を返す
Clear() すべてのオブジェクトを削除する
Dequeue() 先頭にあるオブジェクトを削除し、返す
Enqueue(item) 末尾にオブジェクトを追加する
Peek() 先頭にあるオブジェクトを削除せずに返す
Dictionary Add(key,value) 指定したキーと値を追加する
Clear() すべてのキーと値を削除する
TryGetValue(key, out value) 指定したキーに対応する値を取得する
ContainsKey(key) 指定したキーが存在するかどうかを判定する
ContainsValue(value) 指定した値が格納されているかどうかを判定する
Remove(key) 指定したキーを持つ要素を削除する

List

以下サンプルコード。

Class MainClass
  Public Shared Sub Main()

    'String型のListとしてインスタンス化
    Dim SampleList As New List(Of String)

    SampleList.Add("Hello")
    SampleList.Add("World")

    'インデックスによる参照(キャスト不要)
    Dim s As String = SampleList(1) ' 出力値:World
    Console.WriteLine(s)

  End Sub
End Class 

List(Of String)とすると、String型のListクラスになる。

型推論を利用すれば、以下のようにも書ける。

Dim SampleList = New List(Of String)

LinkedList

双方向リンクリストのクラス。

配列がベースのListクラスとは異なり、インデックスによるデータの参照はできない。

その代わり、リストの途中への要素の削除と挿入が高速にできるという特徴がある。

以下サンプルコード。

Class MainClass
  Public Shared Sub Main()

    ' LinkedListクラスの利用
    Dim SampleList = New LinkedList(Of String)

    ' 1つ目の要素を追加
    SampleList.AddFirst("First")

    ' 2つ目の要素を追加
    SampleList.AddFirst("Last")

    For i As Integer = 0 To 2
      ' 先頭の要素の後にiの値を文字列に変換したものを追加
      SampleList.AddAfter(SampleList.First, i.ToString())
    Next

    ' すべての要素を順番に表示
    For Each s In SampleList
      Console.WriteLine(s)
    Next

  End Sub
End Class 

実行結果

Last
2
1
0
First 

Listを全件ループで処理する場合は、注意が必要。(詳細)

値渡しと参照渡し

メソッドに引数を渡す方法は、「値渡し」と「参照渡し」がある。

値渡し

Public Shared Sub DoSomething(ByVal arg1 As Integer)
    'パラメータの値を変更する
    arg1 += 1
End Sub

'エントリポイント
Public Shared Sub Main()
    Dim val1 As Integer = 0

    'DoSomethingメソッドを呼び出す
    DoSomething(val1)

    '引数として渡した変数が変化したかを確認する
    Console.WriteLine(val1)
    '「0」と表示される

    Console.ReadLine()
End Sub

VB.NETではByValは省略できるが、できるだけ省略しないこと。

参照渡し

Public Shared Sub DoSomething(ByRef arg1 As Integer)
    'パラメータの値を変更する
    arg1 += 1
End Sub

'エントリポイント
Public Shared Sub Main()
    Dim val1 As Integer = 0

    'DoSomethingメソッドを呼び出す
    DoSomething(val1)

    '引数として渡した変数に変わりがないか確認する
    Console.WriteLine(val1)
    '「1」と表示される

    Console.ReadLine()
End Sub

ByValByRefに変わっただけ。

プロパティプロシージャ

Javaでいうところのゲッター・セッターはプロパティで定義するらしい。

ゲッターとセッターを定義する場合

Public Class SampleClass1
    Private _number1 As Integer = 0
    Public Property Number1() As Integer
        Get
            Return _number1
        End Get
        Set(ByVal value As Integer)
            _number1 = value
        End Set
    End Property
End Class

ゲッターのみ

Public Class SampleClass2
    Private _number2 As Integer = 0
    'Getしかない時はReadOnlyを付ける
    Public ReadOnly Property Number2() As Integer
        Get
            Return _number2
        End Get
    End Property
End Class

セッターのみ

Public Class SampleClass3
    Private _number3 As Integer = 0
    'Setしかない時はWriteOnlyを付ける
    Public WriteOnly Property Number3() As Integer
        Set(ByVal value As Integer)
            _number3 = value
        End Set
    End Property
End Class

オブジェクト指向

クラスの定義

Public Class Employee
    'フィールド
    Private employeeNameValue As String
    'プロパティ
    Public Property EmployeeName() As String
        Get
            Return employeeNameValue
        End Get
        Set(Value As String)
            If Value.Length <> 0 Then
                employeeNameValue = Value
            End If
        End Set
    End Property
    'コンストラクタ
    Public Sub New(employeename As String)
        employeeNameValue = employeename
    End Sub
    'メソッド
    Public Function ShowEmpName() As String
        Return employeeNameValue
    End Function
End Class

インスタンス化・プロパティ使用

'インスタンス生成
Dim emp As Employee
emp = New Employee("FLM01")

'プロパティを使用する(参照)
MassageBox.Show(emp.EmployeeName)

'プロパティを使用する(更新)
emp.EmployeeName = "FLM02"

'メソッドを呼び出す
Dim name = emp.ShowEmpName()
MessageBox.Show(name)

名前空間

名前の衝突を防ぐために必要なもの。

詳しくは、ここを読んでください。

'名前空間の定義
Namespace MySpace1
    '同じクラス名
    Public Class MyClass1
        Public Shared Sub MyMethod1()
            Trace.WriteLine("MySpace1.MyClass1.MyMethod1 called")
        End Sub
    End Class
End Namespace

'名前空間の定義
Namespace MySpace2
    '同じクラス名
    Public Class MyClass1
        Public Shared Sub MyMethod1()
            Trace.WriteLine("MySpace2.MyClass1.MyMethod1 called")
        End Sub
    End Class
End Namespace

Public Class Form1
    Inherits System.Windows.Forms.Form
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'メソッド呼び出し
        MySpace1.MyClass1.MyMethod1()
        MySpace2.MyClass1.MyMethod1()
    End Sub
End Class

LINQ

Language INtegrated Queryの略。直訳すると、「統合言語クエリ」。クエリは「問い合わせ」の意味。

以下公式(MSDN)から引用。

統合言語クエリ (LINQ: Language-Integrated Query) は、クエリ機能を C# 言語 (および Visual Basic や場合によってその他の .NET 言語) に直接統合する一連の技術の名前です。 LINQ を使用すると、クエリは、クラス、メソッド、イベントなどと同じように、高度な機能を備えた言語構成要素になります。 クエリを記述する開発者の場合、LINQ で最も違いを認識できる "統合言語" 部分はクエリ式です。 クエリ式は、C# 3.0 で導入された宣言クエリ構文で記述します。 クエリ構文を使用すると、データ ソースに対する複雑なフィルター処理、順序付け、およびグループ化の操作を最小限のコードで実行できます。 同じ基本的なクエリ式のパターンを使用して、SQL データベース、ADO.NET データセットXML ドキュメントとストリーム、および .NET コレクション内のデータを照会および変換します。

クエリ構文とメソッド構文

LINQ の書き方には「クエリ構文」と「メソッド構文」の 2 種類がある。

Dim list = New List(Of Integer)(New Integer() {1, 84, 95, 95, 40, 6})

'クエリ構文
Dim query = From x In list
            Where x Mod 2 = 0
            Order By x
            Select x * 3

'メソッド構文
Dim query = list _
            .Where(Function(x) x Mod 2 = 0) _
            .OrderBy(Function(x) x) _
            .Select(Function(x) x * 3)