私のように C++ に慣れているプログラマーのために、この回答を追加します。
クラス、インターフェイス、デリゲート、および配列はreference types
です。これは、基になるポインターがあることを意味します。通常の関数呼び出しは、このポインター (参照) を値でコピーしますが、参照による送信では、この参照への参照が送信されます。
//C# code:
void Foo(ClassA input)
void Bar(ClassA ref input)
//equivalent C++ code:
void Foo(ClassA* input)
void Bar(ClassA*& input)
int、double などの構造体や文字列 (文字列はこれらの例外ですが、同様に機能します) などのプリミティブはヒープに割り当てられるため、動作が少し異なります。
//C# code:
void Foo(StructA input)
void Bar(StructA ref input)
//equivalent C++ code:
void Foo(StructA input)
void Bar(StructA& input)
キーワードは、メソッドの宣言と呼び出しの両方で使用するref
必要があるため、参照されていることは明らかです。
//C# code:
void Foobar(ClassB ref input)
...
ClassB instance = new ClassB();
Foobar(ref instance);
//equivalent C++ code:
void Foobar(ClassB*& input)
...
ClassB instance* = new ClassB();
Foobar(instance);
前にも言ったように、この詳細な説明を読んでください。文字列についても説明します。
興味深いことに、参照による呼び出しは基になるポインターで機能するため、次のコードにたどり着きます。
//C# code:
void Foo(ClassA input){
input = input + 3;
}
void Bar(ClassA ref input){
input = input + 3;
}
//equivalent C++ code:
void Foo(ClassA& input){
input = input + 3;
}
void Bar(ClassA*& input){
*input = *input + 3;
}
//equivalent pure C code:
void Fun(ClassA* input){
*input = *input + 3;
}
void Fun(ClassA** input){
*(*input) = *(*input) + 3;
}
これは大まかに同等ですが、ある程度は正しいです。