VB.NET キーワードのトピック

 [Home] |  [Index]

投稿日 2015/06/26
  1. AddHandler, RemoveHandler, Handles
  2. AndAlso, OrElse
  3. ByVal, ByRef
  4. Class, Structure
  5. Const, ReadOnly
  6. Continue
  7. CType, DirectCast, TryCast
  8. Delegate
  9. Exit
  10. Friend
  11. Imports
  12. In / Out (Generic 型パラメータ)
  13. Inherits, Implements
  14. Interface
  15. Is, IsNot
  16. Me, MyClass, MyBase
  17. MustInherit, NotInheritable
  18. Namespace, Global
  19. New (演算子と制約)
  20. Of (Generic 型)
  21. Option
  22. Overloads, Overrides
  23. Overriable, NotOverridable
  24. ParamArray, Optional, 名前付き引数
  25. Partial
  26. Property
  27. ReDim
  28. Shadows
  29. Shared, Static
  30. Sub, Function
  31. Using
  32. With (文)
  33. With, From (初期化子)
  34. WithEvents, RaiseEvent

AddHandler, RemoveHandler, Handles

AddHandler, RemoveHandler, Handles はいずれもイベントに関するキーワードである。AddHandler はイベントハンドラの登録、RemoveHandler が解除を行う。Handles はあるメソッドにイベントを関連付ける。そして、Handles は複数のイベントを指定できる。


AddHandler と RemoveHandler の使用例

''' <summary>
''' キーダウンイベントを有効にする。
''' </summary>
''' <remarks></remarks>
Public Sub OnEvent()
    AddHandler Me.MainWindow.KeyDown, AddressOf OnKeyDown
    Status = True
    MainWindow.ResultText.Text = "KeyDown イベントが有効になりました。"
End Sub

''' <summary>
''' キーダウンイベントを無効にする。
''' </summary>
''' <remarks></remarks>
Public Sub OffEvent()
    RemoveHandler Me.MainWindow.KeyDown, AddressOf OnKeyDown
    Status = False
    MainWindow.ResultText.Text = "KeyDown イベントは無効になりました。"
End Sub

''' <summary>
''' キーダウン・イベントハンドラ
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Sub OnKeyDown(sender As Object, e As KeyEventArgs)
    MainWindow.ResultText.Text = e.Key.ToString()
End Sub

Handles の使用例

Handles は Visual Studio でイベント処理を書く場合、Visual Studio が出すコード内で使用される。プログラマは、Handles の使用をあまり意識する必要はない。一方、AddHandler はプログラム内で動的にイベントハンドラをイベントに割り当てるので、プログラマは意識して使用する。

Private Sub btnClose_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnClose.Click
    Close()
End Sub

このページの先頭へ


AndAlso, OrElse

AndAlso, OrElse は If 文などで使用する。And, Or も同じように動作するが、こちらは式の評価を行うとき、すべての項を計算してから結果を出す。AndAlso, OrElse の場合は、途中で式の結果が確定したときは、残りの項の評価を行わないので無駄な処理がなくなる。

下の例で、a = 1 なので If 文の a = 0 は成立しない。したがって、b = 0 の評価は不要なため行われない。一方、AndAlso の代わりに And を使用すると、b = 0 の評価も行われる。

結論:特別な場合を除き、If や While の中では AndAlso, OrElse を使ったほうがよい。

a = 1
' a = 1 なので AndAlso の右側の評価 (b = 0) は実行されない。
If a = 0 AndAlso b = 0 Then
  ' 処理
End If

このページの先頭へ


ByVal, ByRef

ByVal, ByRef はメソッド定義のとき、引数を値で渡すか参照で渡すかを指定するキーワードである。これを省略すると「値渡し」になるので注意が必要である。(Visual basic 6.0 などではデフォルトは「参照渡し」)

ByVal を付けた引数は、メソッドから戻った時、元の値は書き換えられないが、ByRef を付けた引数はメソッド内でその引数を書き換えると、メソッドから戻った時、元の変数の値も書き換えられる。

結論:原則、メソッドの引数には ByVal を付ける。メソッド内での処理結果を呼び出し元に戻す場合のみ、ByRef を付ける。

このページの先頭へ


Class, Structure

オブジェクトにはクラス (Class) をインスタンス化したものと、構造体 (Structure) をインスタンス化したものがある。構造体の代表的なものは整数 (System.Int32) であり、クラスの代表的なものは文字列 (System.String) である。

この2つの違いはいろいろあるが、気を付ける必要があるのはメソッドの引数として渡す場合とキャストである。

構造体のインスタンスを値渡し引数とメソッドに与えると、メソッド内でその内容を変更しても呼び出し元のインスタンスの内容は変更されない。クラスのインスタンスの場合は、値渡し (ByVal) で引数として与えたとしても、そのメンバーの値を変更すると、呼び出し元のインスタンスのメンバーも更新される。

構造体のインスタンスを TryCast することはできない。構造体のインスタンスが Nothing になることはないためである。

例として次のような構造体とクラスを定義する。

Public Structure Struct1
  Public a As Integer
  Public b As Integer
  
  Public Overrides Function ToString() As String
      Return a.ToString() & "," & b.ToString()
  End Function
End Structure

Public Class Class1
  Public a As Integer
  Public b As Integer
  
  Public Overrides Function ToString() As String
      Return a.ToString() & "," & b.ToString()
  End Function
End Class

Struct1 と Class1 をインスタンス化して、TestStruct というメソッドの引数にする。

Dim objStruct = New Struct1() With {.a = 0, .b = 0}
Dim objClass = New Class1() With {.a = 0, .b = 0}
TestStruct(objStruct, objClass)

Private Sub TestStruct(ByVal x As Struct1, ByVal y As Class1)
   x.a = 100
   x.b = 50
   y.a = -100
   y.b = -50
End Sub

結果は次のようになる。構造体のインスタンスはメソッド内で値を書き換えても、呼び出し元の内容は変化しないが、クラスのインスタンスはたとえ ByVal だとしても変化する。

0,0
-100,-50

このページの先頭へ


Const, ReadOnly

Const と ReadOnly はどちらも定数を作るのに使用するが、Const がコンパイル時に定数であることを決めるのに対し、ReadOnly は実行時にコンストラクタで変数を定数としてマークする。

Const はプログラム実行前に値が決まるので、クラスをインスタンス化した定数は定義できない。よって、整数値や文字列リテラルのみ、値として取ることができる。

Const, ReadOnly の両方とも、定数に値を代入しようとするとコンパイルエラーになる。

Public ReadOnly ROobj As Class1  ' コンストラクタで初期化する。
Public Const Constobj As String = "..."  ' 必ず、リテラルで初期化する

''' <summary>
''' コンストラクタ
''' </summary>
''' <remarks></remarks>
Public Sub New()

    ' この呼び出しはデザイナーで必要です。
    InitializeComponent()
    
    ' InitializeComponent() 呼び出しの後で初期化を追加します。
    ROobj = New Class1() With {.a = 10, .b = 5}  ' ReadOnly 属性の定数を初期化
End Sub

このページの先頭へ


Continue

Continue はループ内で使用され、Continue 以降の文をスキップして、ループの先頭へ戻る。この動作は C# など他の言語と同じである。違いは、Continue の後にループの種類を書かなければならないことである。例えば、For ループの中で Continue を使う場合は、Continue For と書く必要がある。(Visual Studio を使っている場合は、For を入力しなくても自動的に補完される)

For i = 1 To 10
   If i Mod 2 = 1 Then
      Continue For
   End If
   str += i.ToString() & " "  ' この文は i が奇数のときはスキップされる。
Next

このページの先頭へ


CType, DirectCast, TryCast

これらは「キャスト」演算子で、ある変数の型を別の型に変更するときに使用する。もちろん、型の変更はできない場合もあるので、そうなったときの動作が異なる。

CType はクラシック Visual Basic との互換性のため残されているキャスト演算子である。同種のものには CStr や CInt などがある。

DirectCast は C# のキャスト演算子 (type) 互換の演算子で、キャストに失敗したときは例外を発生させる。また、コンパイル時にキャストができないことがわかれば、その時点でコンパイルエラーとなる。

TryCastは C# の as 演算子互換の演算子で、キャストに失敗したとき、Nothing を返す。整数などは、Nothing を取ることはありえないので、例えば、長整数から整数へのキャストに TryCast を使うことはできない。

Dim i As Integer
Dim ii As Long
ii = 1000
i = CType(ii, Integer)
str += i.ToString() & " "
i = DirectCast(ii, Object)  ' Object でなく Integer だとコンパイルエラー
str += i.ToString() & " "
i = TryCast(ii, Object)
str += i.ToString() & " "   ' Object でなく Integer だとコンパイルエラー

このページの先頭へ


Delegate

Delegate はメソッドの「型」(プロトタイプ)を定義するときに使用する。これはコールバックなどよく利用される。

' Delegate の定義
Public Delegate Sub CallbackClass2(ByVal msg As String)

Public Class Class2
   Public callBack As CallbackClass2
   Private n As Integer = 0
   
   Public Sub CallbackTest()
       If callBack Is Nothing Then
          ' callBack が未定義なら何もしない。
           Return
       End If
       n += 1
       callBack("呼び出し回数: " + n.ToString())  ' コールバックする。
   End Sub
End Class
Dim obj2 As Class2

' 初期化
Private Sub Window_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
  obj2 = New Class2()
  obj2.callBack = AddressOf Class2Callback
  
  obj2.CallbackTest()
End Sub

 ''' 
 ''' Class2 のコールバックテスト用
 ''' 
 ''' 
 ''' 
 Private Sub Class2Callback(ByVal msg As String)
     ResultText.Text = msg
 End Sub
 

このページの先頭へ


Exit

Exit はループからの脱出に使用する。C# の break に相当するが、Exit の後にループの種類 (For など) が必要である。また、Exit Sub などとして、メソッドの途中で処理を終えるのにも使用できる。

i = 0
While i < 10
   If i > 7 Then
      Exit While
   End If
   i += 1
End While
ResultText.Text = i.ToString()

このページの先頭へ


Friend

Friend は、Public や Private などと同じような使い方をする。Friend は Public に似ているが、公開範囲は同じアセンブリの中だけである。アセンブリとはザックリ言えば EXE ファイルや DLL ファイルのことである。したがって、DLL 内の Friend クラスを外部の EXE ファイル内のメインメソッドから参照することはできない。

メソッドやクラスで Public や Private を付けないと、Friend とみなされる。

このページの先頭へ


Imports

Imports は参照する名前空間を指定する。Imports で指定された名前空間は、コーディングのとき省略できる。例えば、StringBuilder クラスは、System.Text 名前空間に含まれるが、Imports System.Text と書いておけば、System.Text を省略して、New StringBuilder() と書くだけでインスタンス化できる。

Imports に名前空間を書くだけでは、うまく動かない場合がある(参照エラー)。これは、アセンブリ参照が漏れているためである。Visual Studio ではソリューションエクスプローラでプロジェクトを選択して、「参照の追加」を実行して足りないアセンブリを追加する。

このページの先頭へ


In / Out (Generic 型パラメータ)

これらは、Generic 型パラメータに読み出しだけ(書き込みだけ)のマークを付けて、「共変性」「反変性」の許可・不許可を行うものである。

Public Interface Interface1(Of In T)
   Function getValue() As T  ' In パラメータなのでこれはコンパイルエラーになる。
   Sub setValue(ByVal x As T)  ' Out パラメータなのでこれは問題なし。
End Interface

Public Interface Interface2(Of Out T)
   Function getValue() As T  ' Out パラメータなのでこれは問題なし。
   Sub setValue(ByVal x As T)  ' Out パラメータなのでこれはコンパイルエラーになる。
End Interface

このページの先頭へ


Inherits, Implements

Inherits はクラスの継承に使う。一方、Implements はインタフェースの実装に使う。

Public Class Class3
   Inherits Class2
   
End Class

Public Class Class4
   Implements Interface1(Of String)
   
   Public Sub setValue(x As String) Implements Interface1(Of String).setValue
   
   End Sub
End Class

このページの先頭へ


Interface

Interface はインタフェースを定義するのに使用する。インタフェースとは、クラスに似ているが、メソッドやプロパティは実装されておらず、インスタンス化して使うことはできない。インタフェースはクラスが備えるべき「仕様」を定義したものである。

インタフェースはクラスに「実装」することにより使用される。クラスにインタフェースを実装するときは、Implements キーワードを使用する。

Public Class Class5
   Implements IComparable
   
   Public Function CompareTo(obj As Object) As Integer Implements System.IComparable.CompareTo
       Dim v() As Double = obj
       Dim r = Math.Sqrt(v(0) * v(0) + v(1) * v(1))
       Return r - 10.0
   End Function
End Class

あるいは、メソッドの引数の定義や変数の型としても利用されることがある。

このページの先頭へ


Is, IsNot

Is や IsNot 演算子は Nothing かどうかを判別するのによく使用される。本来は同じオブジェクトかどうかを判別するのに使用する。

If a Is Nothing Then
  ' 文
End If

このページの先頭へ


Me, MyClass, MyBase

Me と MyClass はそのオブジェクト自身を返す。一方、MyBase は親のクラス(基底クラス)のインスタンスを返す。

Me と MyClass は同じように使えるが、次の2点が異なる。

Me (MyClass でも可) は、次の例のようにクラスで定義されている変数と外部変数や引数を区別するのによく使用される。

Class Class1
  Private x As Double
  Private y As Double
  
  Public Sub New(ByVal x As Double, ByVal y As Double)
    Me.x = x
    Me.y = y
  End Sub
  ' ...
End Class

MyBase はコンストラクタで基底クラスのコンストラクタを呼び出してクラスのメンバー変数を初期化するのによく使用される。

Public Class Class7
   Private x As Double
   Private y As Double
   
   Public Sub New(ByVal x As Double, ByVal y As Double)
     MyClass.x = x  ' Me.x = x でもよい
     MyClass.y = x  ' Me.y = y でもよい
   End Sub
   ' ...
End Class

Public Class Class71 : Inherits Class7
   Public Sub New(ByVal x As Double, ByVal y As Double)
     MyBase.New(x, y)  ' Class7 のコンストラクタを呼び出す。
   End Sub
   ' ...
End Class

このページの先頭へ


MustInherit, NotInheritable

MustInherit はインスタンス化できず、必ず他のクラスの基底クラスとして使用するクラスを定義するとき使用する。一方、NotInheritable は逆に基底クラスになることはできず、それ自身をインスタンス化して使用するクラスを表す。

MustInherit が付いたクラスには必ず MustOverride が付いたメソッドが必要になる。このメソッドは派生クラスで必ずオーバーライドする。

Public MustInherit Class Class8
   Public MustOverride Sub Method()  ' 実体がないので End Sub は不要
End Class

Public Class Class81 : Inherits Class8
   ' MustInherit が付いた Class8 から派生したクラスなので必ず Method() をオーバーライドする。
   Public Overrides Sub Method()
     ' ...
   End Sub
End Class

NotInheritable が付いたクラスは必ず直接インスタンス化する(派生クラスを作ることはできない)。他のクラスを継承することはできるが、MustOverride が付いたメソッドは必ずオーバーライドする必要がある。

Public NotInheritable Class Class8
  ' ...
End Class

Dim obj = New Class8()

このページの先頭へ


Namespace, Global

Namespace は名前空間を定義するとき使用する。

Namespace Sample
  Public Class Class1
    ' ...
  End Class
  ' ...
End Namespace

前の例 (Namespace Smaple) で、クラス Class1 をインスタンス化するときには、Sample をクラス名を先頭に付ける。

Dim obj = New Sample.Class1()

もし、Class1 という名前のクラスが他にある場合、Sample.Class1 とすることで区別が可能になる。大きなプログラムでは、名前の衝突を避けるため名前空間がよく利用される。

名前空間に Global という名前を付けてはならない。Global は特別な意味を持っている。Global は最上位の名前空間ですべての名前空間は、Global の下になる。ただし、次のような使い方は可能である。

Namespace Global.Sample
  ' ...
End Namespace

このページの先頭へ


New (演算子、コンストラクタとGeneric 制約)

New キーワードはいろいろな意味を持つ。たいていは、クラスのインスタンス化を行うときの演算子として使用する。クラスのコンストラクタの名前としても New が使用される。

匿名型のオブジェクトをインスタンス化するときは、New With として使用する。

Dim data = From x In dataSet1 Select New With { x.id, x.Name }

Generic の制約として New を使うと、具体的な型でないとエラーになる New 演算子によるインスタンス化がエラーにならずにコンパイルできる。

Public Class Class9(Of T As {New})
   Property Data As T
   
   Public Sub New()
      Data = New T   ' New 制約があるのでエラーにならない。
   End Sub
End Class

このページの先頭へ


Of (Generic 型)

Generic 型を作るときは Of キーワードを使う。

Dim list = New List(Of String)()

このページの先頭へ


Option

Option キーワードはソースプログラム内でコンパイラオプションを指定するのに使用する。以下のようなものがある。

このページの先頭へ


Overloads, Overrides

Overloads キーワードは、派生クラスで同じ名前のメソッドやプロパティがあるとき使用する。(逆の操作は Shadows)

Public Class Class10
   Dim n As Integer
   
   Public Overloads Sub Method()
   
   End Sub
End Class

Public Class Class101 : Inherits Class10
   Public Overloads Sub Method(ByVal x As Integer)
   
   End Sub
End Class

Overrides は派生クラスで基底クラスのメソッドを再定義したとき使用する。

Public Class Class10
   Dim n As Integer
   
   Public Overridable Sub Method()
   
   End Sub
End Class

Public Class Class101 : Inherits Class10
   Public Overriades Sub Method()
   
   End Sub
End Class

このページの先頭へ


Overriable, NotOverridable

Overriable はあるメソッドが派生クラスで再定義できることを指定する。これは、最初のクラスで1回だけ行えば、その後の子クラス、孫クラス等々でずっと有効である。NotOverridable は子クラス、孫クラス等々で有効になっている Overriable を無効にする。NotOverridable を付けたメソッドは、それ以降の派生クラスで再定義できなくなる。

' 基底クラス
Public Class Class102
   Public Overridable Sub Method()
   
   End Sub
   
   Public Overridable Sub Method2()
   
   End Sub
End Class

' 子のクラス
Public Class Class103 : Inherits Class102
   ' オーバーライド可能
   Public Overrides Sub Method()
       MyBase.Method()
       
   End Sub
   
   ' NotOverridable により、これ以上オーバーライドできないようにする。
   Public NotOverridable Overrides Sub Method2()
       MyBase.Method2()
       
   End Sub
End Class

' 孫のクラス
Public Class Class104 : Inherits Class103
   ' Class102 がオーバーライド可能なので Class103 もオーバーライド可能
   Public Overrides Sub Method()
       MyBase.Method()
   End Sub
End Class

このページの先頭へ


ParamArray, Optional, 名前付き引数

ParamArray はメソッドで可変個数の引数を受け取れるようにする。Optional は引数を省略したとき、既定の値を使用できるようにする。

Public Class Class11
   ' ParamArray を使ったメソッド
   '   可変個数のパラメータを受け取れるようにする。
   '   呼び出し時に配列でなく、引数の並びとして記述できる。
   Public Function AddAll(ByVal ParamArray p As Integer()) As Integer
       Dim sum = 0
       For Each x In p
           sum += x
       Next
       Return sum
   End Function
   
   ' Optional を使ったメソッド
   '  呼出しのとき y を省略できる。その場合は、y = "," とみなされる。
   Public Function Addstr(ByVal x As String, Optional ByVal y As String = ",") As String
       Return x & y
   End Function
End Class

次のようにすると引数の名前に値を割り当てて呼び出すことができる。つまり、引数リストに name := value のようにして引数を与える。こうすると、引数の順番に関わらず値を指定できる。

obj.Addstr(y := ":", y := "xxxx")

このページの先頭へ


Partial

Partial は大きなクラスを2つ以上のファイルに分けて記述するのに使用できる。Visual Studio では、Windows Forms などで、画面のデザイン部分と機能部分を Partial を使って分けている。

Windows Forms の Form1.Designer.vb の例

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Form1
  Inherits System.Windows.Forms.Form
  ' ...
End Class

Windows Forms の Form1.vb の例。ビルド時には、Form1.Designer.vb と結合されて1つのファイルとしてコンパイルされる。Partial はどちらか片方についていればよい。

Public Class Form1
   ' ...
End Class

このページの先頭へ


Property

Property はプロパティを定義するのに使用する。Property には、ReadOnly または WriteOnly を付けて読み出し専用、書き込み専用のプロパティを定義することもできる。Property には必ずアクセサ (Get または Set またはその両方) が必要である。

Private _name As String

Public Property MyName As String
    Get
        Return _name
    End Get
    Set(value As String)
        _name = value
    End Set
End Property

次のように、アクセサを省略することもできる(アクセサ内部で独自処理を行わない場合)。その場合は、コンパイラにより自動的にプライベート変数が実装される。

Public Property MyName As String

このページの先頭へ


ReDim

ReDim は配列の長さを変更するときに使用する。この機能は、クラシック Visual Basic との互換のための機能である。

Private arr() As Integer

Public Sub New(ByVal n As Integer)
   ReDim arr(n)
   ' ...
End Sub

このページの先頭へ


Shadows

Shadows は基底クラスにあるメソッドと同じ名前のメソッドを派生クラスで作る場合、オーバーライドでなく、機能が異なる新しいメソッドとする場合に使用する。Shadows を使うと元のメソッドは隠されて使用できなくなる。

Public Class Class1
  Public Function Method() As Integer
     Return 0
  End Function
End Class

Public Class Class2
  Inherits Class1
  
  ' Shadows を使って Class1 の Method() と同じ名前のメソッドを作成する。
  Public Shadows Function Method() As Integer
     Return 1
  End Function
  
  Public Function Method2() As Integer
     Return MyBase.Method()  ' MyBase を使えば Class1 の Method() を呼び出せる。
  End Function
End Class

このページの先頭へ


Shared, Static

Shared は「スタティックなメソッド」を作るとき使用する。通常、メソッドはクラスをインスタンス化しないと使えないが、スタティックなメソッドはクラスをインスタンス化せずに使うことができる。例えば、System.Math クラスのメソッドは Shared が付いているので、System.Math をインスタンス化せずに使用できる。下にSystem.Math.Abs() の例を示す。

' System.Math.Abs() の宣言
Public Shared Function Abs ( _
  value As Integer _
) As Integer

このメソッドを使うときは、クラス名.メソッドのようにしてコールする。

Dim i = Math.Abs(-1)

Static はメソッド内で「スタティックな変数」を作るとき使用する。スタティックな変数はメソッドが終了しても値が消えずにそのまま残り、次回呼び出されたときは前の値がそのまま使用できる。初期化は最初の1回だけ行われ、2回目にメソッドが呼び出されても実行されない。

Public Function GetStatic() As Integer
   Static val As Integer = -1  ' 最初に呼び出されたときのみ実行される。
   val += 1
   Return val  ' val は Return 後も値を保持する。
End Function

このページの先頭へ


Sub, Function

Sub, Function はメソッドを定義するとき使用するが、名前なしのメソッドや関数も定義できる。名前のないメソッドは匿名メソッド、ラムダ式などと呼ばれることがある。

リストの要素全体に対して何かの処理を行う場合、たいてい For Each 文を使うが、ForEach というメソッドも用意されていて、このメソッドを使う場合などに匿名メソッドを使うと便利である。

ラムダ式は下のように簡略化した文法を使って書くことができる。

Dim list1 As New List(Of Integer) From {3, 6, 8}
ResultText.Text = ""
list1.ForEach(Sub(v) ResultText.Text += v.ToString())

このページの先頭へ


Using

Using はリソースの自動解放を行うときに使用する。よく使うのは、ファイルの読み書きのときで、Using ブロックを使うと、どこでブロックを抜けても自動的に Close が実行される。

Using fs = File.CreateText("C:\temp\test.txt")
   fs.WriteLine("System.IO")
   fs.WriteLine("StreamWriter")
End Using  ' fs.Close() を実行しなくても OK

このページの先頭へ


With (文)

Width 文の中ではオブジェクト参照を省略できる。長い With ブロックは見づらいので避けたほうがよい。

Dim obj1 = New Class1()
With obj1
  .a = 12
  .b = 10
End With

このページの先頭へ


With, From (初期化子)

With を使うとオブジェクトの初期化をインスタンス化のときに実行できる。一方、From はコレクションのインスタンス化のときにコレクションの要素を初期化するのに使用する。

Dim obj1 = New Class1() With {.a = 5, .b = 2}
Dim list1 As New List(Of Integer) From {3, 6, 8}

このページの先頭へ


WithEvents, RaiseEvent

WithEvents を使って宣言したメソッドは、Handles を使ってイベントに結び付けることができる。

RaiseEvent 文はイベントを発生させることができる。

Public Class Class1
  ' イベントを定義 (Action はシステムで定義されている Delegate)
  Public Event Event1 As Action
  
  ' 外部からイベントを発生させるためのメソッド
  Public Sub NewEvent()
     RaiseEvent Event1()
  End Sub
  
  ' イベントハンドラ
  Public Sub Action1() Handles Me.Event1
     Beep()
  End Sub
End Class

イベントを発生することのあるオブジェクトは、WithEvents を付けて宣言する。宣言はメソッドのローカル変数としては不可となる。

WithEvents objEv As New Class1

Yield, Iterator

Yield は関数を複数回呼び出す毎に、異なる値を返せるようにする。これは、IEnumerable, IEnumerator を実装するときに使用する。Yield で値を返す関数は先頭に Iterator を付ける必要がある。

Sub Main()
  Dim col As IEnumerable(Of Int32) = From i In Range(1, 10) 
             Where i > 5 
             Select i
  ' 結果を表示
  For Each i In col
     Console.WriteLine(i)
  Next
End  Sub

' IEnumerable を返す関数。Yield で値を返している。
Iterator Function Range(ByVal startval As Integer, ByVal endval As Integer) As IEnumerable(Of Integer)
     For i = startval To endval
         Yield i
     Next
End Function

 

このページのトップへ