VB のたまご

作成日: 2015/12/03, 更新日: 2015/12/03


頻繁に使いそうな、各変数の初期化方法を再確認しよう

  •  リストを初期化しようとした際に、毎回書き方を忘れてしまうため、これを機会に各初期化の方法をまとめます。
  • そういえば昔、VB.NET を教えてもらった先生から、「変数宣言時は初期値を割り当てて、未割当な変数へのアクセスエラーを出さないようにしましょうね。」 と言われたことを思い出しました。そして今は、Visual Studio 先生が代わりに、「使用されないローカル変数 ' 変数名 ' です。」と教えてくれます。 ありがたや~。

スポンサーリンク


単一データ、その1

  •  これはまぁ、普通に書きます。参照型の場合は、わざわざ3番目の書き方はしないかなぁ。
  • Dim s1 As String = "hello"               ' 変数名 As 型名 = 初期値
    Dim d1 As New Date(2015, 1, 1)           ' 変数名 As New インスタンス生成しての初期値
    Dim d2 As Date = New Date(2015, 1, 1)    ' 変数名 As 型名 = インスタンス生成しての初期値
    

単一データ、その2、オブジェクト初期化子

  •  VB2008 から、オブジェクト初期化子が使えるようになりました。
  • オブジェクト初期化子とは、インスタンス生成処理と、指定したメンバーの初期化処理を一度にできる機能です。 メンバーは多くの場合、プロパティを指定します。
  •  オブジェクト初期化子を使用すると、初期化する命令数を減らすことができます。 例えば、以下2つのサンプルはどちらも同じですが、後者のオブジェクト初期化子を使用した場合、単一行で済むことができます。
  • Dim b1 As New Button
    b1.Name = "button1"
    b1.Text = "button1"
    
    Dim b1 As New Button With {.Name = "button1", .Text = "button1"}
    

  •  引数付きのコンストラクタを利用した場合の、オブジェクト初期化子による初期化の仕方です。
  • Dim taro As New Person("taro", 15) With {.Name = "本当はjiro", .Age = 28}
    
    Class Person
        Public Property Name As String = String.Empty
        Public Property Age As Integer = -1
        Public Sub New(name As String, age As Integer)
            Me.Name = name
            Me.Age = age
        End Sub
    End Class
    

  •  ただし、初期化するメンバー数が多い場合、横に長くなり可読性が悪くなります。 私は、必ずしもオブジェクト初期化子経由にしなくてもいい、という位置づけで理解しています。 大事なポイントは、それをうまく利用することであり、単一行に拘らず、以下のように適宜改行を入れて、 見やすいコードに工夫することだと考えます。
  • Dim b1 As New Button With {.Name = "button1",
                               .Text = "button1"}
    

スポンサーリンク


コレクションデータ、その1

  •  続いて、配列、リストなどのコレクションデータです。扱いやすいのはリストですが、見通しが良いのは配列ですね。
  • ' 配列
    Dim s1() As String = New String() {"a", "b"}
    Dim s2() As String = {"a", "b"}
    Dim d1() As Decimal = New Decimal() {1D, 2D}
    Dim d2() As Decimal = {1D, 2D}
    
    ' リスト
    Dim lst1 As New ArrayList(New String() {"a", "b"})
    Dim lst2 As New List(Of String)(New String() {"a", "b"})
    Dim lst3 As New List(Of String)({"a", "b"})
    Dim lst4 As New List(Of Decimal)(New Decimal() {1D, 2D})
    Dim lst5 As New List(Of Decimal)({1D, 2D})
    
    

コレクションデータ、その2、コレクション初期化子

  •  VB2010 から、コレクション初期化子が使えるようになりました。
  • コレクション初期化子とは、オブジェクト初期化子のコレクション版の機能です。 ただし、どんなコレクションデータでも使えるのではなく、① For Each ループができて、②Add メソッドを定義している、 という2つの条件を満たしたコレクションデータだけが、コレクション初期化子を使うことができます。 配列の場合、For Each ループはできますが、Add メソッドが無いため、コレクション初期化子を使うことができません。 逆に、リストの場合は、2つとも満たしているので、コレクション初期化子を使うことができます。
  •  カッコの代わりに、From キーワードが間を取り持ってくれて、見やすいです。
  • Dim lst1 As New List(Of String) From {"a", "b"}
    Dim lst2 As New List(Of Decimal) From {1D, 2D}
    

  •  ディクショナリーになると、複数行形式の方がパッと見、分かりやすいのかなと思います。 まぁ、ケースバイケースですね。
  • Dim lst3 As New Dictionary(Of Integer, String) From {{1, "a"}, {2, "b"}, {3, "c"}}
    Dim lst4 As New Dictionary(Of Integer, String) From {
        {1, "a"},
        {2, "b"},
        {3, "c"}
        }
    

  •  コレクション初期化子の中で、オブジェクト初期化子を使うことができます。
  • Dim lst5 As New List(Of Button) From {
        New Button With {.Name = "button1", .Text = "button1"},
        New Button With {.Name = "button2", .Text = "button2"},
        New Button With {.Name = "button3", .Text = "button3"}
        }
    

  •  なぜか毎回 From キーワードが頭から出てこなくて悩むのですが、よく見たら、インテリセンスが教えてくれるんですね。 全然気づきませんでした。。。

  •  最後までこの記事を読んでいただき、ありがとうございました。

  • スポンサーリンク