2008年12月23日火曜日

.NET Option Strict ステートメント

Option Strict ステートメント

Option Strict On
  • 変数の宣言でAs句を省略できません。
  • 遅延バインディングは禁止されます。
  • 明示的なキャスト演算子を使用しない縮小変換は禁止されます。



Option Strict Off
  • 変数の宣言でAs句を省略できす。
  • 遅延バインディングを使用できます。
  • 明示的なキャスト演算子を使用しない縮小変換が使用できます。




デフォルトはOption Strict Off です。
Microsoftのホームページに
「Option Strict On によって 厳密な型指定が可能になり、データの損失を伴う意図しない型変換を回避でき、
遅延バインディングが禁止されて、パフォーマンスが改善されるので、必ず使用することをお勧めします。」
とあります。

必ず使用することをお勧めします
Σ(゚д゚;) ヌオォ!? デフォルトでOption Strict Onにしたらいいじゃないの!?


Option StrictをデフォルトでOnにするには


「ツール」→「オプション」→「プロジェクトおよびソリューション」→「VisualBasicの規定値」で
Option Strictのデフォルト値をOnに設定できます。



変数の宣言でAs句を省略


Option Strict Offでは変数の宣言でAs句での型指定を省略することができ変数はObject型になります。
Option Strinct Onではコンパイルエラーとなります。
Public Shared Sub Main()
Dim a
a = 123

a = 123.4567

a = "123"
End Sub




遅延バインディング


遅延バインディングとは、Object型の変数にインスタンを代入し、そのインスタンスのメソッドなどを呼び出すことです。
Option Strict Offでは下記のコードは正常に実行されます。Option Strict Onではコンパイルエラーとなります。
Public Shared Sub Main()
Dim obj As Object
obj = New System.Windows.Forms.Form
obj.Text = "CreateForm"
Console.WriteLine(obj.Text)
End Sub

このコードではObject型の変数にフォームのインスタンスを代入しそのTextプロパティを参照しています。
コンパイル時は変数objがTextプロパティを利用可能か判断できないので、エラーにならず、
実行時に変数objに代入されているインスタンスをチェックし、Textプロパティが存在するか判断します。

これに対し、インスタンスが特定の型として宣言された変数に代入される場合を事前バインディングといいます。
Option Strict Onでは遅延バインディングは禁止され、事前バイディングを使用することになります。
Public Shared Sub Main()
Dim frm As System.Windows.Forms.Form
frm = New System.Windows.Forms.Form
frm.Text = "CreateForm"
Console.WriteLine(frm.Text)
End Sub




明示的なキャスト演算子を使用しない縮小変換


精度の小さな型を精度の大きな型に変換することを拡大変換といいます。
値型の拡大変換
Public Shared Sub Main()
Dim int As Integer
Dim lng As Long
frm.Text = "CreateForm"
Console.WriteLine(frm.Text)
End Sub


参照型の拡大変換
子クラスは親クラスのすべてのメンバをもっているため、拡大変換をおこなっても何も問題が発生しません。
Public Shared Sub Main()
Dim frm As System.Windows.Forms.Form
frm = New System.Windows.Forms.Form
frm.Text = "CreateForm"
Console.WriteLine(frm.Text)
End Sub


拡大変換は、実行時には常に正常に行われ、データ消失が発生することはありません。
Option Strict OnでもOffでも、拡大変換は暗黙的に実行できます。

拡大変換に対し精度の大きな型を精度の小さな型に変換することを縮小変換といいます。
縮小変換は正常に行われるとは限りません。

たとえばOption Strict Offで以下のコードをを実行すると、
Long型の値がInteger型の範囲に収まらないため、OverflowExceptionが発生します。
Public Shared Sub Main()
Dim lng As Long = 12345678901
Dim int As Integer
int = lng
End Sub


またOption Strict Offで以下のコードを実行すると、
Double型の値の小数点以下部分が欠落します。
Public Shared Sub Main()
Dim dbl As Double = 123.45
Dim int As Integer
int = dbl
End Sub


Option Strict Onでは上記のコードはコンパイルエラーととなります。
縮小変換を行う場合、明示的にキャスト演算子を使用しなければなりません。
Public Shared Sub Main()
Dim lng As Long = 123
Dim int As Integer
int = Cint(lng)
End Sub

0 件のコメント: