C#では、参照渡しは次のとおりです。
void MyFunction(ref Dog dog)
しかし、これまで見てきたC++/CLIコード例では、ref
は使用されていませんが、代わりに^
記号が使用されています。
void MyFunction(Dog ^ dog)
^
シンボルの使用は、パラメーターを渡すときにref
の直接の置き換えですか?それとも私が知らない他の意味がありますか?
追加の質問:私もたくさん見ます:
Dog ^ myDog = gcnew Dog();
C++では*
(ポインタ)のように使用されているようです。同様に機能しますか?
ありがとう!
Dog
が参照型(C#ではclass
)の場合、C++/CLIに相当するものは次のとおりです。
void MyFunction(Dog^% dog)
Dog
が値型(C#ではstruct
)の場合、C++/CLIに相当するものは次のとおりです。
void MyFunction(Dog% dog)
タイプデコレータとして、^
はC++では*
と大まかに相関し、%
はC++では&
と大まかに相関します。
単項演算子として、通常はC++/CLIで*
を使用する必要があり、C++では*
を使用しますが、通常は%
を使用する必要があります。 C++で&
を使用するC++/CLI。
^演算子は、C++/CLIのポインターと同様に動作します。違いは、ガベージコレクションされたポインタであるということです。そう:
Dog ^ mydog = gcnew Dog();
単に、マネージメモリ(gcnew)を使用して新しく、マネージポインタをmydogに戻すと言っています。
そう:
void MyFunction(Dog ^ dog)
実際にはアドレスで渡されており、参照ではありませんが、ちょっと似ています。 C/C++で参照渡ししたい場合は、次のようにします。
void MyFunction(Dog &dog);
関数宣言で。 C++/CLIでも同じだと思いますが、試したことはありません。参照が使用されていることが常に明確であるとは限らないため、参照を使用しないようにしています。
編集:まあ、それは同じではありません、それは&ではありません、それは彼らもそれを変更しなければならないことは理にかなっています。愚かなC++/CLI。
MSDNから- ^ (Handle to Object on Managed Heap)
:
管理対象ヒープ上のオブジェクトへのハンドルを宣言します。
そして:
共通言語ランタイムは、正確で非同期の圧縮ガベージコレクションスキームを実装する別個のヒープを維持します。正しく機能するには、実行時にこのヒープを指すことができるすべてのストレージの場所を追跡する必要があります。 ^は、ガベージコレクターがマネージヒープ上のオブジェクトへの参照を追跡できるハンドルを提供します。これにより、オブジェクトが移動されるたびにオブジェクトを更新できます。
「^」記号は、「Dog」がCLRオブジェクトであり、C++オブジェクトDogへのポインタである「Dog *」などの従来のC++オブジェクトではないことを示します。これは、「Dog ^ dog」が、C#の「Dogdog」(「refDogdog」ではない)と同じ意味を持つことを意味します。
C++/CLIの3つのタイプ:
Person ^pp = gcnew Person(); // gcnew in C++/CLI is similar to new in C++.
int %ri = i; // ri is reference alias for i.
Person %rPerson = *pp; // pp from point number 1