ゆなこんブログ

ゆなこんぴゅーたー (Yuna Computer) の公式ブログ

必ずOption Strict Onにする

ベストプラクティス

必ず Option Strict On にします。

Option Strict On

ただし、ソースコードに明示はしないで、プロジェクトの設定で On にします。

プロジェクトの設定を On にする方法については、以前投稿した以下の記事をご覧ください。

blog.yuna-computer.com

理由

Option Strict Off だと、縮小変換 (Narrowing Conversions) が起きるコードを書いても、エラーが出なくなってしまいます。 縮小変換は、(概念上)大きいものを小さいものに入れるということであり、あふれる可能性があるため危険です。 実行時エラーの原因になります。

また、遅延バインディング (Late binding) が起きるようになります。 バインディングとは型のバインディングのことで、言い換えるならば型の決定のことです。 遅延とは(コンパイル時ではなく)実行時まで遅らせることです。 つまり、遅延バインディングとは、オブジェクト(変数)の型を実行時に決めるということです。 実行時に型を決めるための余計なコードが入るため、実行速度が遅くなります。 実行時の型が持たないメソッドなどを呼び出そうとすると、実行時にエラーが起きてしまいます。

さらに Option Infer Off と組み合わせると、As 句がない変数宣言で Object 型になってしまいます。 たとえ Integer 型の値で初期化したとしても、As 句がなければ変数は Object 型です。 この場合、ボックス化 (Boxing)とボックス化解除 (Unboxing) が起きるため、メモリ使用量が増え、さらに実行速度が遅くなります。 (実際は Option Infer On がベストプラクティスのため、この問題は起きにくいです。)

' 2 は Integer 型だが、As 句がないため、なんと n は Object 型になってしまう。
Dim n = 2 

Option Strict On ならば、暗黙の縮小変換が許可されず、危険な縮小変換をしないコードに書き換える機会が生まれます。 本当に縮小変換が必要な場合は、「危険なことを分かってやっている」ことを、キャストを書き意図をコードで表すことができます。

また、事前バインディング (Early Binding) になり、コンパイル時に型を決定することができるため、実行速度が速くなります。 コンパイル時に型が決まるため、「持っていないメソッドを呼び出そうとした」場合、コンパイル時にエラーを出せます。 「持っていないメソッドを呼び出そうとした」という実行時エラーは起きません。 型が明確なため、コーディング時もインテリセンスなどの IDE のサポートを最大限受けることができ、開発効率を上げることができます。

Option Infer On と組み合わせることによって、初期化時に、As 句を書かずに、初期値の型で変数を宣言することができます。

' 2 は Integer 型。n は Integer 型。
Dim n = 2

Microsoft が Option Strict On にすることを公式にすすめています。

方法

プロジェクトの設定で、Option Strict On にします。 個々のファイルには Option Strict On を一切書きません。

常にプロジェクト全体が Option Strict On の状態になり、一貫性がもてます。 ファイルを追加しても自然と Option Strict On になります。 これは簡単です。ソースコードが簡潔になります。

その他の方法

Visual Basic コンパイラを直接呼び出している場合、常に -optionstrict+ オプションを付けてコンパイルします。

トレードオフ

Option Strict On にすると、型を明示的に宣言しなければならないことがあるため、その分コーディング量が増えることがあります。 しかし Option Infer On と組み合わせることによって、型を明示することなく型の恩恵を受けられるようになります。 Option Infer On のおかげで、コーディング量が増えることはほぼありません。 コンパイル時に型が決まるため、早くにエラーを見つけることができ、デバッグ・エラー修正の労力を減らすことができます。

ほぼすべてのケースにおいて、(節約できるデバッグにかかるコスト)>(コーディング量が増えるコスト)です。

本当に遅延バインディング (Late binding) が必要なケース

遅延バインディング専用のファイルを作り、ファイルの先頭に Option Strict Off と書きます。 遅延バインディングに関係する最小の部分だけ Partial Class の機能を使ってコーディングします。

Option Strict Off にすると、必要な遅延バインディングだけではなく、不要な(危険な)暗黙の縮小変換まで許可されてしまうので、 本当に最小のコードだけをこの特別なファイルに書きます。

参照