BETA

VB.NET 文法メモ

投稿日:2019-11-30
最終更新:2019-11-30

演算子

(知らなかったもののみ)

記号 説明 記号 説明
整数除算(商) Mod 乗除演算(あまり)
<> 等しくない ^ 指数演算(^=)
x += 1 x = x + 1 (x++) x -= 1 x = x - 1 (x--)
<<=
>>=
|<<
>>
& 文字列連結 Xor 排他的論理和
AndAlso 左がFalseの場合は右は見ないAnd OrELSE 左がFalseの場合は右は見ないOR
IS
IS NOT
同一のオブジェクトを参照しているか/否か LIKE 右のパターンと一致するか
IsTrue |ISFalse

制限

ファイルの先頭に記載することで制限をかける

'暗黙の変数宣言  
Option Explicit Off ' 変数宣言を必要としないようにする  
Option Explicit On  ' 変数宣言が必ず必要になるようにする(デフォ)  

'暗黙の型変換  
Option Strict Off ' 自動型変換ON(デフォ)  
Option Strict On  ' 自動型変換OFF  

'文字列の比較アルゴリズム設定  
Option Compare Text   ' 文字列比較時に大文字小文字区別しない  
Option Compare Binary ' 文字列比較時に大文字小文字区別する(デフォ)  

'ローカル型の推論  
Option Infer Off ' 型推論OFF  
Option Infer On  ' 型推論ON(デフォ)  

変数と定数

宣言


' 変数宣言  
Dim variable_name As data_type  
Dim variable_name As data_type = default_value  
Dim variable_name  
Dim variable_name = default_value ' ※型推論  
Dim variable_name1, variable_name2, variable_name3 As data_type  
' 定数宣言  
Const variable_name As data_type  
Const variable_name As data_type = default_value  
Const variable_name  
Const variable_name = default_value ' ※型推論  
Const variable_name1, variable_name2, variable_name3 As data_type  

配列

宣言

Dim list_name(index_max_value) As data_type  
Dim list_name() As data_type = New data_type(index_max_value){  
default_value1, default_value2}  
Dim list_name() As data_type = {default_value1, default_value2}  
Dim list_name As New List(Of data_type)(New data_type() {default_value1, default_value2, default_value3})  

'再定義(Preserve...既に格納されている値の保持)  
ReDim [Preserve] Pre_list_name(new_index_max_value) ' 確保  
Pre_List_name(nex_index) = value ' 追加  

可変配列(要素はObject型として管理)


' List(Of data_type) ... 型指定あり, 基本こっちを使おう  
' 都度キャストが必要ないためarraylistよりパフォーマンスが上  
Dim list_name As New List(Of data_type)() ' 宣言  
list_name.Add(value)      ' 追加  
list_name.Insert(index, value) ' 挿入  
list_name.Count           ' 要素数取得  
list_name.Item(index)     ' 要素の取得  
list_name.Contains(value) ' 要素の検索(bool)  
list_name.Remove(value)   ' 指定の(一番初めに出現した)要素を削除  
list_name.RemoveAt(index) ' 指定の場所の要素を削除  
list_name.Clear()         ' すべての要素の削除  
list_name.Sort()          ' ソート  

' ArrayList ... object型  
Dim list_name As New ArrayList ' 宣言  
' あとは大体上と同じ(なはず)  

連想配列


' Dictionary ... 型指定あり, 基本こっちを使おう  
Dim dict_name As New Dictionary(Of data_type, data_type)  ' 宣言  
dict_name.Add(keys, value)     ' 追加  
dict_name.Count                ' 要素数取得  
dict_name.Item(key)            ' 要素の取得  
dict_name.ContainsKey(key)     ' キーの検索(bool)  
dict_name.ContainsValue(value) ' 要素の検索(bool)  
dict_name.Remove(key)          ' 指定の要素を削除  
dict_name.Clear()              ' すべての要素の削除  


' HashTable ... Object型  
Dim ht_name As New Hashtable ' 宣言  
' あとは大体上と同じ(なはず)  

タプル

Dim list_name As New List(Of Tuple(Of String, String, String))  
Dim tuple_name1 As New Tuple(Of String, String, String)  
 ("value1", "value2", "value3")  
Dim tuple_name2 As New Tuple(Of String, String, String)  
 ("value4", "value5", "value6")  
list_name.add(tuple_name1)  
list_name.add(tuple_name2)  
' {(value1, value2, value3), (value4, value5, value6)}  
' タプル... 要素の"変更", "削除"ができない配列みたいなもの。  
' 例えば個人情報("名前", "住所", "電話番号"..)を1セットとして  
' リストに格納していく、みたいな使い方をする(個人情報リスト)  

分岐

If文

If conditional_expression1 Then   
    statements1 ' 文、処理  
Else If conditional_expression2  
    statements2 ' 文、処理  
Else If Not conditional_expression3  
    statements3 ' 文、処理  
Else  
    statementsX ' 文、処理  
End If  
' conditional_expression ... 条件式  

Select-Case文

Select Case conditional_expression   
    Case valueN ' conditional_expression = valueN  
        statements1  
    Case valueX To valueY ' valueX <=  conditional_expression <= valueY  
        statements2  
    Case IS >= valueZ ' conditional_expression >= valueZ  
        statements3  
    Case valueA, valueB, valueC ' conditional_expression = valueA, con.. = valueB, con.. = valueC  
    Case Else ' default  
        statementsX  
End Select  
' conditional_expression...条件式  
' VBのSelect-Caseは、一つのcaseにしか分岐しない  
' (処理の末尾に暗黙的にbreak文が入っている感じ。)  

反復

For文 - 指定した回数文繰り返す


For counter_variable [As date_type] = default_value   
        To last_value [Step step_value]  
    statements  
Next [counter_variable]  
'step_value ... 進行条件の値、[]は省略可能  

While文(Do-While文) - 条件式がTrueの間繰り返す

' 前判定  
Do While conditional_expression  
    statements  
Loop  

While conditional_expression  
    statements  
End While  

' 後ろ判定  
Do  
    statements  
Loop While conditional_expression  
'conditional_expression...条件式  

Until文(Do-Until文) - 条件式がTrueになるまで繰り返す


' 前判定  
Do Until conditional_expression  
    statements  
Loop  
' 後ろ判定  
Do  
    statements  
Loop Until conditional_expression  
' conditional_expression...条件式  

For-Each文(コレクションから繰り返し)


For Each variable_storing_elements In Collection   
    statements ' コレクションの要素の数分繰り返す  
Next [variable_storing_elements]   
' variable_storing_elements ... 要素を格納する変数  
' 出力順番は関係なし。  

Exit文 - コードブロックの実行を途中終了(Break文みたいなもの)


'For文/For-Each文の場合  
For ~  
    statements  
ExitFor  
Next  
'While文/Until文の場合  
Do While/Until ~  
    statements  
    ExitDo  
Loop  

Continue文 - 実行制御を次の反復処理に移す


'For文/For-Each文の場合  
For ~  
    statements  
    Continue For  
Next  
'While文/Until文の場合  
Do While/Until ~  
    statements  
    Continue Do  
Loop  

例外処理 ... エラーをチェックする

try-catch-finally文


Try  
' エラーをチェックする処理  
    checked_statements  
Catch variable As System.Exception ' もしエラーがあれば  
' エラーに対応する処理  
    error_supported_process   
Finally  
' エラーをチェックする処理が終わった後に必ず実行する処理  
    absolutely_execute_process   

Throw文 ... 例外の強制的な生成

Throw New Class_Name()  

クラス

アクセス修飾子


'同一の型に含まれる要素からのみアクセス可能  
Private Class Cl1   
'同一の型またはその派生型に含まれる要素からアクセス可能  
Protected Class Cl1   
'同一のアセンブリに含まれる要素からのみアクセス可能  
Friend Class Cl1   
'Protected or Friendでアクセス可能  
Protected Friend Class Cl1   
'アクセス制限なし  
Public Class Cl1   
(以下、アクセス修飾子はPublicで統一)

クラスを利用する

Public Class Class_Name2  
    ' フィールドの定義  
    Public variable_name As data_type ' グローバル変数  
    Public Shared variable_name As data_type = value '共有メンバー  
    Public Property procedure_name As data_type 'プロパティ  

    ' メソッドの定義  
    Public Sub procedure_name()  
        ' 宣言(名前空間は省略)  
        Dim object_variable_name As Class_Name1  
        object_variable_name = New Class_Name1()  
        Dim object_variable_name As Class_Name1 = New Class_Name1()  
        Dim object_variable_name As New Class_Name1()  

        object_variable_name.method() ' subメソッドの実行  
        object_variavle_name.method(arg) ' functionメソッドの実行  
        object_variable_name.property ' プロパティ(データ)へのアクセス  
        Class_Name1.member ' 共有メンバーの呼び出し  
        object_variable_name = Nothing ' 参照の終了  
    End Sub  
End Class  

Public Partial Class Class_Name2 ' Partialクラス(上クラスの続き)  
...  
End Class  

プロシージャ(メソッド)


'Subプロシージャ - メソッド/処理  
Public Sub procedure_name([parameter As data_type])   
    stetements  
End Sub  

'Functionプロシージャ - メソッド/処理  
Public Function procedure_name([parameter As data_type])   
        As data_type_of_return_value  
    statements  
    Return return_value  
End Function  

'この二つは処理なので呼び出しには()をつける  
object_variable_name.method()  

' Propertyプロシージャ(基本) - フィールド/データの定義  
Public Property procedure_name() As data_type '基本的にPublic  
    Public Get  
        Return _return_value '読み取りに対する処理例  
    End Get  
    Public Set(value As data_type)  
        _return_value = value '書き込みに対する処理例  
    End Set  
End Property  

Private _variable_name As data_type ' ↓専用プロパティのために仮定義  

' Propertyプロシージャ(読み取り専用)  
Public ReadOnly Property procedure_name() As data_type  
    Get  
        Return _variable_name '読み取りに対する処理例  
    End Get  
End Property  

' Propertyプロシージャ(書き込み専用)  
Public WriteOnly Property procedure_name(value As data_type) As data_type  
    Set  
        _variable_name = value '書き込みに対する処理例  
    End Get  
End Property  

' Propertyプロシージャ(自動実装プロパティ)  
Public Property procedure_name As data_type '基本  
Public ReadOnly Property procedure_name As data_type '読み取り専用  
Public WriteOnly Property procedure_name As data_type '書き込み専用  

'これはフィールドの定義なので呼び出しには()はいらない  
object_variable_name.member  

値渡し(ByVal)と参照渡し(ByRef)


' 値渡し(コピー/元変更なし)  
Public Sub/Func procedure_Name(ByVal variable...)  
' 参照渡し(参照/元変更あり)  
Public Sub/Func procedure_Name(ByRef variable...)  

オーバーロード


' "Overloads"キーワードは全部につけるか、全部につけないか統一する  
Public Class Class_Name1  
    Public [Overloads] Sub procedure_name1()  
        statements1  
    End Sub  
    Public [Overloads] Sub procedure_name1(ByVal variable_name1 As data_type1)  
        statements2  
    End Sub  
    Public [Overloads] Sub procedure_name1(ByVal variable_name1 _  
            As data_type2, ByRef variable_name2 As data_type1)  
        statements3  
    End Sub  
End Class  

コンストラクター(フィールドの初期値の設定)

Public Class Class_Name1  
    [Public] Sub New(parameter1)  
        Me.member1 = value1  
        Me.member2 = value2  
    End Sub  
    [Public] [Overloads] Sub New(parameter1, parameter2)  
        Me.member1 = value3  
        Me.memner2 = value4  
    End Sub  
End Class  

名前空間


NameSpace name_space_name1  
    NameSpace name_space_name2  
        Public Class Class_Name1...  
    End NameSpace  
    NameSpace name_space_name3  
        Public Class Class_Name2...  
    End NameSpace  
End NameSpace  

Imports name_space_name1.class_name ' 先頭にimport文記載の場合  
name_space_name1.class_name.method() ' 直接完全修飾子記載の場合  
'ほかVSの設定ファイル->参照-インポートされた名前空間から設定も可能  

継承

Public Class Class_Name1 ' 基本クラス  
    Sub New(value1 As Integer, value2 As Integer)  
        Me.member1 = value1  
        Me.member2 = value2  
    End Sub  
    Public Sub procedure_name1()  
    End Sub  
End Class  

Public Class Class_Name2 ' 派生クラス  
    Inherits Class_Name1 ' 継承  
    Sub New(value1 As Integer, value2 As Integer, value3 As String)  
        ' 基本クラスのコンストラクタの呼び出し  
        MyBase.New(value1, value2) ' コンストラクターが継承されていないので  
        'Me.member1 = value1 ←↓  
        'Me.member2 = value2 ←↓  
        Me.member3 = value3  
    End Sub  
End Class  

多態性

オーバーライド
Public Class Class_Name1 ' 基本クラス  
    public Overridable Function procedure_name1 As data_type  
        statements1  
    End Function  
End Class   

Public Class Class_Name2 ' 派生クラス  
    Inherits Class_Name1  
    Public Overrides Function procedure_name1 As data_type  
        statements1  
        statements2  
    End Function  
End Class   
インターフェース
Interface IInterface_name1 ' インターフェース名: I+CamelCase  
    Function procedure_name1() As data_type1 ' 呼び出しクラスが定義  
End Interface  

Public Class Class_Name1  
    Implements IInterface_name  
    Public Function procedure_name1() As data_type1 _  
            Implements IInterface_name.procedure_name1 '必ず呼ぶ必要あり  
        statement  
    End Function  
End Class  

ほか

共有メンバー(Shared修飾子)

Public Class Class_Name1  
    Public Shared variable_name As data_type = value  
End Class  
Class_Name.variable_name ' オブジェクト変数ではなくクラスから直接  
モジュール

Public Module module_name  
    ' 特徴1. すべてが共有メンバー  
    module_name.member  
    ' 特徴2. インスタンス生成不可  
    Dim variable_name As New module_name() '-> error  
    ' 特徴3. 継承不可  
    Inherits module_name '-> error  
End Module  
構造体
Public Structure sturucture_name1  
    ' 使い方  
    Dim variable_name1 As data_type1  
    Dim variable_name2 As data_type2  
    ' ...  
    ' 特徴1. 初期化子による初期化はできない  
    Public Shared test As Integer = 0 '-> error  
    ' 特徴2. 継承できない  
    Inherits structure_name2 '-> error  
    ' 特徴3. 独自にコンストラクターの定義ができない  
    Sub New() : End Sub '-> error  
    ' 特徴4. 値型(<->参照型)  
End Structure  
enum(列挙型)
' 変更できない整数値(Byte, Short, Int ,Long, U~型)の列挙型  
Enum Enum_name As Integer  
    member1  
    member2  
    member3 = 0  
    member4 = 5  
End Enum  

Dim en As enum_name  
en = Enum_name.member1  

' Enum.GetValues() ... 全ての値を列挙  
For Each i In [Enum].GetValues(GetType(enum_name))  
    Console.WriteLine(i)  
Next  

' Enum.TryParse  
[Enum].TryParse(Of enum_name)("member5", 4)  

' Enum.Parse  
' <Flags>属性  
抽象クラスと抽象メソッド
MustInherits Class Class_Name1 ' 抽象クラス  
    ' 特徴1. オブジェクト生成(new)できない  
    ' 特徴2. 継承前提  
    ' 特徴3. 抽象メソッド(抽象クラスにしか定義できない)  
    Public MustOverrides Function procedure_name1() As data_type  
    ' 特徴3-1. 宣言のみのメソッド  
    ' 特徴3-2. 派生クラスでオーバーライドしなければならない  
End Class  

Public Class Class_Name2  
    Inherits Class_Name1  
    Public Overrides Function As data_type ' 必ずオーバーライド  
        statements  
    End Function  
End Class  
With文
With Object_Variable  
    .member1 = value1  
    .member2 = value2  
    .member3 = value3  
    .method()  
End With  
デストラクターとオブジェクト破棄

Public Class Class_Name1  
    'デストラクター(Finalize)  
    Protected [Overrides] Sub Finalize()  
        statements ' 終了処理  
    End Sub  

    ' Disposeメソッド(手動で強制オブジェクト破棄)  
    variable_name.Dispose()  

    ' Usingステートメント  
    Using object_variable_name As New Class_Name1  
        ' 最後に自動的にDisposeメソッド呼び出しするスコープ  
    End Using  
End Class  
統合言語クエリ (LINQ)
Dim query_name = _  
 From iteration_variable1 As data_type In data_source1 _  
  Join iteration_variable2 As data_type In data_source2 _  
   On iteration_variable1.item_name1 Equals iteration_variable2.item_name2  
    Order By iteration_variable1.item_name1  
     Where conditional_expression   
      Select item_variable1 = output_item1, item_variable2 = output_item2  
' ほかにもgroupbyなど  
データベース操作

Public Class Class_Name1  
    ' オブジェクト変数定義  
    Dim _sqlConnection As New SqlConnection()  
    Dim _sqlCommand As New SqlCommand()  
    Dim _sqlDataReader As New SqlDataReader()  
    Dim _sqlTransaction As New SqlTransaction()  

    ' 接続方法の定義  
    _sqlConnection.ConnectionString =   
        System.Configuration.ConfigurationManager  
            .ConnectionStrings("CONNECTION_STRING").ConnectionString  
    _sqlCommand.Connection = _sqlConnection  

    Try  
        ' 接続  
        _sqlConnection.Open()  

        ' 操作(SQL文:返り値なし)  
        _sqlCommand.CommandText = "SQL_STATEMENTS1"  
        _sqlCommand.CommandType = _sqlCommand.CommandText  
        _sqlCommand.ExecuteNonQuery()  

        ' 操作(SQL文:返り値あり1)  
        _sqlCommand.CommandText = "SQL_STATEMENTS2"  
        _sqlCommand.CommandType = _sqlCommand.CommandText  
        _sqlDataReader = _sqlCommand.ExecuteReader()  
        Do While _sqlDataReader.Read()  
            Console.Writeline(dr("KEY_NAME"))  
        Loop  

        ' 操作(SQL文:返り値あり2)  
        _sqlCommand.CommandText = "SQL_STATEMENTS3"  
        _sqlCommand.CommandType = _sqlCommand.CommandText  
        ' 実行した結果一つだけ  
        _sqlCommand.ExecuteScalar()  


        ' 操作(SQL文:返り値あり3 - ストアドプロシージャ)  
        _sqlCommand.CommandType = _sqlCommand.StoredProcedure  
        If _sqlCommand.Parameters.Count = 0 Then  
            _sqlCommand.Parameters("@EmpName", SqlDbType.VarChar, 40)  
            _sqlCommand.Parameters("@EmpName").value = "String"  
            _sqlCommand.Parameters("@EmpName").Direction = ParameterDirection.Input  
        Else  
            _sqlCommand.Parameters("@EmpName").value = "String"  
        EndIf   

        ' 操作(SQL文:トランザクションあり)  
        try  
            _sqlTransaction = _sqlConnection.BeginTransaction()  
            _sqlCommand.transaction = _sqlTransaction  
            _sqlCommand.CommandText = "SQL_STATEMENTS4"  
            _sqlCommand. ' 実行処理  
            '......  
        Catch ex As Exception  
            Try  
                tran.Rollback()  
            Catch ex2 As Exception  
            End Try  
        End Try  


    Catch ex As Exception  
        Console.WriteLine(ex.ToString)  
    Finally  
        ' 切断  
        _sqlConnection.Close()  
    End Try  
End Class  
テスト

' 単体テスト  
<TestClass[()]> ' テストを含むクラス  
Public Class TestClass1  
    <TestMethod[()]> ' テストメソッド  
    ' ( <ClassInitialize[()]> 単体テスト実行の最初に一度だけ呼び出される  
    ' ( <TestInitialize[()]> 各テストメソッドの実行前に必ず呼び出される  
    ' ( <TestCleanup[()]> 各テストメソッドの実行後に必ず呼び出される  
    ' ( <ClassCleanup[()]> 単体テスト実行後に一度だけ呼び出される  

    <TestCategory("Category_Name")> ' テストカテゴリー  
    <Owner("Test_Representative")> ' テスト担当者  
    <Priority(No)> ' 優先順位(1最小)  
    Public Sub Test_Method_Name1()  
        ' TODO: テスト ロジックをここに追加してください <- おまじまい  

        ' Assertクラス  
        Assert.AreEqual<data_type>(object1, object2) ' <=> AreNotEqual()  
        Assert.IsNull(object) ' <=> IsNotNULL()  
        Assert.IsTrue(boolean) ' <=> IsFalse()  
        Assert.IsInstanceOfType(object) ' 型チェック <=> IsNotInstanceOfType()   
        Assert.Inconclusive() ' テスト結果の成功失敗が判断できない  
        Assert.Fail ' テストを強制的に失敗とする  

        ' StringAssertクラス  
        StringAssert.Contains("String1","String2") ' 文字列1から文字列2を検索  
        StringAssert.Matches("String", Regex) ' 文字列と正規表現が一致するか  
        StringAssert.StartsWith("String1", "String2") ' 文字列1が文字列2で始まるか  
        StringAssert.EndWith("String1", "String2") ' 文字列1が文字列2で終わるか  

        ' CollectionAssertクラス  
        CollectionAssert.Contains(Collection, Object) ' コレクションの中にオブジェクト存在するか検索  
        CollectionAssert.AreEqual(Collection1, Collection2) ' コレクション1,コレクション2が同じか  
        CollectionAssert.AllItemsAreUnique(Collection) ' コレクションの値が一意であるか  
        CollectionAssert.AllItemsAreInstancesOfType(Collection, Type) ' コレクション内の値がすべて指定した型か  
        CollectionAssert.AllItemsAreNotNull(Collection) ' Nullが存在するか検索(×null存在)  

        CollectionAssert.IsSubsetOf(Collection1, Collection2) ' コレクション1がコレクション2のサブセットであるか  

        CollectionAssert.IsSubsetOf(Collection1, Collection2) ' コレクション1がコレクション2のサブセットであるか  
    End Sub  

    <TestMethod()>  
    'SqlServerの利用  
    <DataSource("System.Data.SqlClient",  
    "Data Source=localhost;Integrated security=SSPI; Initial Catalog=DBNAME;",  
    "TABLENAME", DataAccessMethod.Sequential)>  
    'Accessの利用  
    <DataSource("System.Data.Oledb",  
    @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=FILEPATH",  
    "TABLENAME", DataAccessMethod.Sequential)>  
    ' Excelの利用  
    <DataSource("System.Data.OleDb",   
    "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=FILEPATH;Extended Properties=""Excel 12.0;HDR=YES""",  
    "SHEETNAME$", DataAccessMethod.Sequential)>  
    Public Sub Test_Method_Name2()   
        Dim variable_name As Integer = TestContext.DataRow[.item]("ROWNAME") ' 特定の行の特定のROWNAMEの値を取り出す  
        ' https://msdn.microsoft.com/en-us/library/system.data.datarow(v=vs.110).aspx  
    End Sub  

    ' UIテスト(Only VS Ver.Enterprise)  
    <TestMethod()>  
    Public Sub Test_Method_Name3()  
        '   
        Dim variable_name1 As WinClient = Me.UIForm1Window,UIFormClient  
        '   
        Dim variable_name2 As WinEdit = Me.UIForm1Window,UIItem0Window.UITextBox1Edit  
        '   
        Dim variable_name3 As WinEdit = Me.UIForm1Window,UIItem0Window.UITextBox2Edit  
        '   
        Dim variable_name4 As WinButton = Me.UIForm1Window,UIItem0Window.UITextBox1Edit  
    End Sub  

    MouseClick(variable_name1, New Point(x, y))  
    variable_name2.Text = value  

End Class  
#Region

#Region "block_name" '   
    ' VisualStudioで折り畳み可能なブロック(-/+)  
#End Region   
禁忌

Public Class Test1()  
'goto文(Reason: コードが追えなくなる、可読性の低下)  
Label1  
    statements  
    Public Sub jump()  
        goto Label1 ' Label1と記載されている位置にジャンプ  
    End Sub  

' Callステートメント  
Dim test_object As New Ctest1  
    test_object.test() ' 同じ  
    Call test_object.test() ' 同じ  
End Class  
Public Class Ctest1()   
    Public Sub test()  
    End Sub  
End Class  

参考:vbでのcallステートメントについて

Tips

最後に

  • すでに上がってる記事はこちらの記事に追記したものです。
@MewW6mの技術ブログ

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう