web-dev-qa-db-ja.com

^記号は、C ++ / CLIコードで渡すパラメーターのC#の「ref」を置き換えますか?

C#では、参照渡しは次のとおりです。

void MyFunction(ref Dog dog)

しかし、これまで見てきたC++/CLIコード例では、refは使用されていませんが、代わりに^記号が使用されています。

void MyFunction(Dog ^ dog)

^シンボルの使用は、パラメーターを渡すときにrefの直接の置き換えですか?それとも私が知らない他の意味がありますか?

追加の質問:私もたくさん見ます:

Dog ^ myDog = gcnew Dog();

C++では*(ポインタ)のように使用されているようです。同様に機能しますか?

ありがとう!

19
developer

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。

32
ildjarn

^演算子は、C++/CLIのポインターと同様に動作します。違いは、ガベージコレクションされたポインタであるということです。そう:

Dog ^ mydog = gcnew Dog();

単に、マネージメモリ(gcnew)を使用して新しく、マネージポインタをmydogに戻すと言っています。

そう:

void MyFunction(Dog ^ dog)

実際にはアドレスで渡されており、参照ではありませんが、ちょっと似ています。 C/C++で参照渡ししたい場合は、次のようにします。

void MyFunction(Dog &dog);

関数宣言で。 C++/CLIでも同じだと思いますが、試したことはありません。参照が使用されていることが常に明確であるとは限らないため、参照を使用しないようにしています。

編集:まあ、それは同じではありません、それは&ではありません、それは彼らもそれを変更しなければならないことは理にかなっています。愚かなC++/CLI。

2
DanTheMan

MSDNから- ^ (Handle to Object on Managed Heap)

管理対象ヒープ上のオブジェクトへのハンドルを宣言します。

そして:

共通言語ランタイムは、正確で非同期の圧縮ガベージコレクションスキームを実装する別個のヒープを維持します。正しく機能するには、実行時にこのヒープを指すことができるすべてのストレージの場所を追跡する必要があります。 ^は、ガベージコレクターがマネージヒープ上のオブジェクトへの参照を追跡できるハンドルを提供します。これにより、オブジェクトが移動されるたびにオブジェクトを更新できます。

1
Oded

「^」記号は、「Dog」がCLRオブジェクトであり、C++オブジェクトDogへのポインタである「Dog *」などの従来のC++オブジェクトではないことを示します。これは、「Dog ^ dog」が、C#の「Dogdog」(「refDogdog」ではない)と同じ意味を持つことを意味します。

1
Peter O.

C++/CLIの3つのタイプ:

  1. ハンドルタイプ(^):ハンドルには変数のアドレスが含まれていますが、使用可能な空きメモリを最大化するために変数を移動する必要がある場合は、実行時に更新できます。
    例:Person ^pp = gcnew Person(); // gcnew in C++/CLI is similar to new in C++.

  2. 参照型(%):変数の参照エイリアス。 C++/CLIの%はC++の&に似ています。
    例:int %ri = i; // ri is reference alias for i.
    Person %rPerson = *pp; // pp from point number 1

  3. 配列タイプ([]):
0
Kool Wagh