VB文法リファレンス - タイプコンストラクタ
型共通の初期化処理を定義します。デフォルトコンストラクタと似ていますが、デフォルトコンストラクタは、インスタンスの初期化ですので違う機能です。
使用に適した状況
型に共通して存在する初期化処理が必要な場合。インスタンスごとに必要な処理か、型に必要な処理なのかをよく考えて使い分ける必要があります。
サンプル
'-------------------------------------------------------
'コンストラクタ
'-------------------------------------------------------
Imports System
Class ReferenceType
Public Value As Integer
Public Shared BaseValue As Integer
Shared Sub New()
BaseValue = 10 '静的な変数などを初期化
Console.WriteLine("参照型のタイプコンストラクタが呼び出されました。")
End Sub
Public Overrides Function ToString() As String
Return "値は" & (Me.Value + BaseValue).ToString()
End Function
End Class
Structure ValueType
Public Value As Integer
Public Shared BaseValue As Integer
Shared Sub New()
BaseValue = 10 '静的な変数などを初期化
Console.WriteLine("値型のタイプコンストラクタが呼び出されました。")
End Sub
Public Overrides Function ToString() As String
Return "値は" & (Me.Value + BaseValue).ToString()
End Function
End Structure
Module Sample
Sub Main()
'参照型のタイプコンストラクタ
Console.WriteLine("参照型のタイプコンストラクタは呼び出されるかな?")
Dim r As ReferenceType() = New ReferenceType(10) {}
r(0) = New ReferenceType() 'Nullに初期化されている
r(0).Value = 10
Console.WriteLine("参照しなくてもタイプコンストラクタは呼び出さられる。")
Console.WriteLine(r(0).ToString() & vbNewLine)
'値型のタイプコンストラクタの挙動は難しいので避けるべき
Console.WriteLine("値型のタイプコンストラクタは呼び出さられるかな?")
Dim v As ValueType() = New ValueType(10) {}
'v(0) = new ValueType( ) '値型は必要ない
v(0).Value = 100
Console.WriteLine("あれ?参照してみよう。")
'値型のタイプコンストラクタ派参照すると呼び出される
Console.WriteLine(v(0).ToString() & vbNewLine)
'終了
Console.WriteLine("終了")
Console.ReadLine()
End Sub
End Module
文法
静的指定している点と、アクセス修飾子が指定できず、規定でprivateになる点を除けば、デフォルトコンストラクタと同じ文法です。文法的には似ていますが、全く違う内容を表わしているので十分に注意してください。
解説
インスタンスではなく、型を対象にした初期化処理が必要な場合があります。例えば、型に属する変数の初期化処理や、環境の準備などが必要な場合、タイプコンストラクタを使用します。インスタンスごとに行う初期化なのか、型に対して行う初期化処理なのかは、十分に設計しておく必要があります。
注意するべき点は、参照型と値型の挙動が違う点です。参照型と値型はメモリ配置の形式が異なりますので、タイプコンストラクタの実行されるタイミングが異なります。特に値型は参照型よりもルールが複雑なので、極力値型のタイプコンストラクタの定義は避けるべきだと思います。もしどうしても必要ならば、必ず検証作業をしておくべきでしょう。そうしないと、発見困難なエラーに悩まされる羽目になるかもしれません。