4

現在、一部の VB ソース コードを C# に変換する作業を行っています。これを自動化するコンバーターがあり、実際にこの特定の dll を書き換えずに使用できることは理解していますが、VB をよりよく理解できるように部分的に実行しています。それを書くことを期待するほどではありませんが、少なくともそれを読むことができるようになるのに役立ちます.

ただし、これを行う際に、非常に紛らわしいものに出くわしました。次のコード スニペットは例ですが、プログラム全体で見てきました。

VB ソース コード:

Friend Function AllocateObjectNumber() As Long
    AllocateObjectNumber = _nextFreeObjectNumber
    _nextFreeObjectNumber += 1
    _objectAllocatedCount += 1
End Function

私の翻訳されたC#コード:

    internal long AllocateObjectNumber()
    {
        cvNextFreeObjectNumber += 1;
        cvObjectAllocatedCount += 1;
        return cvNextFreeObjectNumber;
    }

私が理解していないのは、VB が使用するフロー制御です。AllocateObjectNumber += 1が の代わりに使用されていることは理解していreturn cvNextFreeObjectNumberますが、この行が 2 つの変数のインクリメントの前にある場合、そのコードが到達不能と見なされないのはなぜでしょうか? 私の C# の理解に基づくと、このメソッドの最初の行はすぐに呼び出し元のメソッドに戻り、このメソッド全体が基本的に疑似プロパティとして機能します。

役立つ説明はありますか?

4

2 に答える 2

8

VB のアプローチは、値を一時変数に格納することに似ています。

internal long AllocateObjectNumber()
{
    var nextNumber = _nextFreeObjectNumber
    cvNextFreeObjectNumber += 1;
    cvObjectAllocatedCount += 1;
    return nextNumber;
}

VB では、function = value構文は a を実行しないreturnので、後のコードは実行し続けることができます。そのメソッドが最後に到達すると、使用した値が最初に呼び出されたものの「戻り値」になります。

function = value例で使用した一時変数を必要とせずに、異なる条件で異なる結果を返す方法として、同じメソッドで構文を複数回使用できます。

于 2013-04-18T15:15:36.633 に答える
4

私のC#の理解に基づいて、このメソッドの最初の行はすぐに呼び出し元のメソッドに戻ります

しかし、これは C# コードではなく、VB コードです。AllocateObjectNumber = _nextFreeObjectNumber戻りませ。戻り値を割り当てるだけです。実際の戻り値はメソッドの最後にあります。

ほとんどの人は、実際には C# コードと同じ VB コードを記述します。つまり、Return明示的に使用します。assign-to-method-name スタイルは、関数から値を返す唯一の方法であった古い VB バージョンの名残です。VB.NET では、両方を使用できます。

于 2013-04-18T15:19:02.433 に答える