VB.NET基本メモ
昨日VBネタが出てきたので、いつの日か自分用に書いたメモを転記。
基本的には、Microsoftと@ITから引用した内容だったと思います。
間違いあるかもしれません。
VBまとめ
命名規則
Microsoftから引用。
名前の中の各単語を大文字で始める。
- 例えば、
FindLastRecode
やRedrawMyForm
のようにする。
- 例えば、
関数やメソッド名は動詞で始める。
- 例えば、
InitNameArray
やCloseDialog
のようにする。
- 例えば、
クラス、構造体、モジュールやプロパティ名は名詞で始める。
- 例えば、
EmployeeName
やCarAccessory
のようにする。
- 例えば、
インターフェイス名はプレフィックス"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
ByVal
がByRef
に変わっただけ。
プロパティプロシージャ
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)