よろしくお願いします
言語を正しく注意深く使用することで、理解が深まります。
値による受け渡しは、引数のコピーが渡されることを意味します。
はい、これは正確です。
そのコピーを変更しても、元のコピーは変更されません。
ではない正確に。値と変数を注意深く区別することから始めます。検討:
class Foo { public int x; }
...
void N()
{
Foo blah = new Foo();
blah.x = 0;
M(blah);
}
...
void M(Foo foo)
{
foo.x = 123; // changes blah.x
foo = null; // does not change blah
}
ここでの変数はx、blah、fooです。xはフィールド、blahはローカル、fooは正式なパラメーターです。
ここでの値はnull、0、123、およびFooのインスタンスへの参照です。 その参照は値です。この事実を理解することが重要です。
変数blahの値を変数fooにコピーすることにより、blahの値のコピーが渡されます。blahの値は、Fooのインスタンスへの参照です。
MにはFooへの参照であるblahの値のコピーがあるため、Mは変数xの値を変更できます。Mがfooの内容をnullに変更しても、それはblahを変更しません。fooには、blahの値のコピーが含まれています。
参照による受け渡しとは、オリジナルへの参照が渡されることを意味します。
言葉遣いは慎重に選んでください。「オリジナル」とは何ですか?
これは、「参照による受け渡しとは、変数でなければならない引数への参照が渡されることを意味します」とより適切に表現されます。それについて考えるより簡単な方法は、「参照によって渡すと、パラメーターが引数として渡される変数のエイリアスになる」ということです。
参照への変更はオリジナルに影響します。
パラメータと引数は相互のエイリアスであるため、参照への変更が元の値に影響を与えるわけではありません。参照はオリジナルです。これらは両方とも同じ変数です。
REFは、関数に入る前にオブジェクトが初期化されることをコンパイラーに通知します。
「オブジェクト」は無意味です。あなたは「変数」を意味します。
「ref」は「変数が初期化されていることをコンパイラに通知」しません。むしろ、「ref」はコンパイラに「あなた、コンパイラは、変数が初期化されていることを確認する必要があります」と伝えます。それはかなり違います!
REFは、値がすでに設定されていることを意味します。
いいえ、refでは変数がすでに設定されている必要があります。「値を設定する」などというものはありません。
したがって、メソッドはそれを読み取って変更できます。
「それ」とは「変数」を意味します。
REFは、インとアウトの2つの方法です。
正しい。
OUTは、オブジェクトが関数内で初期化されることをコンパイラーに通知します。
「変数」を意味する「オブジェクト」の使用をやめます。まったく異なることを混乱させないようにすれば、物事をより明確に理解できるようになります。変数はオブジェクトではありません。変数は保存場所であり、その一部には値が含まれている場合があり、それらの値の一部はオブジェクトへの参照である場合があります。
したがって、outは、変数がメソッド内で初期化されることをコンパイラーに通知します。そうですが、それは正しくありません。メソッドが例外をスローしたり、メソッドが無限ループに入ったりする場合を忘れています。これらも正当なシナリオです。
OUTは、値がまだ設定されていないことを意味します。
繰り返しますが、「値」とは「変数」を意味します。しかし、これは正確ではありません。初期化された変数を「out」パラメーターとして渡すことは完全に合法です。無意味ですが、合法です。
したがって、returnを呼び出す前に設定する必要があります。
「return」は呼び出されません。メソッドが呼び出されます。しかし、はい、メソッドは正常に戻る前に変数に値を割り当てる必要があります。
OUTは一方向のみであり、それはアウトです。
右。
したがって、どのシナリオでrefキーワードとoutキーワードの使用を組み合わせますか
そのようなシナリオはありません。