VBは7よりReturn構文が追加されて、C系のReturn を利用できるようになりました。
Visual Basic .NET 移行ガイド 第 4 章 スムーズな移行のためのポイント ~プログラミング編~ プロシージャ
http://www.microsoft.com/japan/msdn/net/vbtransitionguide/chapter4/chapter4_11.asp
には以下のように書かれています。
>また、Return キーワードを利用すると、実行コードを生成するときに最適化がより適切に行なわれるため、パフォーマンスの面でも優れているといえます。関数名を Return に変えるだけでよいのですから、ぜひ置き換えを行なってください。
果たしてそうでしょうか?
アセンブラ的に解釈すると戻り値はスタックに帰り値を押し込めてreturnするだけでしかありません。
Public Shared Function ret() As Integer
Return 0
End Function
Public Shared Function fnc() As Integer
fnc = 0
End Function
これらは等価であると思います。
さてIL検証しましょう。
.method public static int32 ret() cil managed
{
// Code Size: 7 byte(s)
.maxstack 1
.locals (
int32 num1)
L_0000: nop
L_0001: ldc.i4.0
L_0002: stloc.0
L_0003: br.s L_0005
L_0005: ldloc.0
L_0006: ret
}
.method public static int32 fnc() cil managed
{
// Code Size: 5 byte(s)
.maxstack 1
.locals (
int32 num1)
L_0000: nop
L_0001: ldc.i4.0
L_0002: stloc.0
L_0003: ldloc.0
L_0004: ret
}
驚いたことにretの方がコスト高になっています。
ただし、exit functionしていないので確かに平等ではないかもしれません。
.method public static int32 fnc() cil managed
{
// Code Size: 8 byte(s)
.maxstack 1
.locals (
int32 num1)
L_0000: nop
L_0001: ldc.i4.0
L_0002: stloc.0
L_0003: nop
L_0004: br.s L_0006
L_0006: ldloc.0
L_0007: ret
}
nopが増えてしまいました。
もちろんこの解析は平等ではありません。なぜならあまりにも単純すぎるからです。
ということでこの論理のどちら側の情報でもいいので教えてください。
#もちろんパフォーマンス以外のメリット/デメリットではありません。
##VB7は今までやってなかったのでこの移行ガイドはノーチェックでした。(^^