4

test2 つのパラメーターで呼び出されるメソッドを持つ COM DLL を呼び出す C# プログラムがありByValますByRef

これが COM DLL の機能です。

Public Sub test(ByVal a As String, ByRef b As String)
    a = "a"
    b = "b"
End Sub

これは、C# プログラムが行うことです。

test.Class1 x = new test.Class1();
            string a = "1";
            string b = "2";
            x.test(a, ref b);

キーワードを削除するrefと、コンパイラはキーワードを見逃したことを通知せずref、パラメータを渡すことに気付きましたByVal。キーワードrefref. コンパイラがこの動作を示す理由を知っていますか?

4

1 に答える 1

6

これは、COM 相互運用コードと C# 言語バージョン 4 以降に非常に固有のものです。refはい、この特定のケースでは省略できます。C# バージョン 4 には、Office プログラミングを容易にするための多くの調整が含まれていました。Office API は当初、初期の VB バージョンでうまく動作するように設計されており、デフォルトで ByRef を使用していました。VBAの場合はまだです。そのため、渡された引数を実際に変更していなくても、API には ByRef である多くのメソッド パラメーターがあります。

コンパイラは、必要に応じて、呼び出しを有効にするために一時変数を生成します。その結果、変数は更新されません。気をつけなければならないことがあります。二歩前進、一歩後退:)

于 2016-11-07T15:18:41.220 に答える