2

わかりました、私は C# コーダーであり、VB.NET を読むことさえ困難です。信じられないほどばかげた質問になるかもしれませんが、ご容赦ください。しかし、次のようなコードがあります。

Function GetName(sourceObject as Object) as String
    return sourceObject.Name
End Function

では、おそらく構文が間違っているという事実を無視して、VB.NET は sourceObject から Name プロパティを取得する方法を教えてください。実行時に調べると、sourceObject が Name という名前のプロパティを getter でサポートするタイプであることがわかりますが、この場合、VB.NET は何をするのでしょうか? これを何らかの方法で実行時に自動的にキャストするために、コンパイラによって生成されている追加のコードはありますか?

お察しのとおり、少し混乱しています。前もって感謝します!

4

4 に答える 4

6

これは遅延バインディングのケースです。そのため、sourceObject に Name としてプロパティが含まれている場合、値が返されます。それ以外の場合は、プロパティが見つからないというエラーがスローされます。

C# でのレイト バインディングにはリフレクションが必要なため、コンパイル時エラーがスローされますが、vb.net ではリフレクションなしで実行できます。

Visual Basic コンパイラは、オブジェクトがオブジェクト変数に割り当てられると、バインディングと呼ばれるプロセスを実行します。オブジェクトは、特定のオブジェクト型であると宣言された変数に割り当てられると、事前にバインドされます。アーリー バインド オブジェクトを使用すると、コンパイラは、アプリケーションを実行する前にメモリを割り当てたり、その他の最適化を実行したりできます。対照的に、Object 型として宣言された変数にオブジェクトが代入されると、オブジェクトはレイト バインドされます。このタイプのオブジェクトは、任意のオブジェクトへの参照を保持できます。

于 2012-02-15T11:37:45.337 に答える
3

c#4.0を使用している場合は、これを試すことができます。

return ((dynamic)SourceObject).Name;
于 2012-02-15T11:49:56.270 に答える
2

固有の遅延バインディングのため、タイプ Object のすべての VB 変数は、動的にキャストされた c# オブジェクトと同等です。別の言い方をすれば、c# は、VB と同等の機能を得るために動的を追加しました。

したがって、同等の C# コードは次のようになります。((dynamic) sourceObject).Name

よりクリーンな設計であるため、可能であれば、ジェネリックまたはインターフェイスでこれを行うことを検討します。

于 2012-02-16T05:01:42.070 に答える
1

VB の Late Binding は、コンパイラによる型チェックをバイパスすることに注意してください。渡されるオブジェクトに Name プロパティがない場合、実行時に例外が発生する可能性があります。

于 2012-02-15T19:44:12.497 に答える