アプリ版:「スタンプのみでお礼する」機能のリリースについて

c#について質問です。
メソッドの仮引数をメソッド内で変更しても実引数には影響がないらしいですが、引数に配列があった場合、配列の要素を仮引数側で変えると実引数も影響を受けるのはどうしてですか?
例えば
int x=1000
int[] a = {700,800,900}

method(x,a[0])

console.writeline("x="+x)
console.writeline("a[0]="+a[0])

public void method(int y,int[] b)
{
console.writeline("y="+y)
console.writeline("b[0]="+b[0])

y=100
b[0]=200
}
というように書いたときに、

y=1000
b[0]=700
x=1000
a[0]=200

と出力されると思います。
仮引数を変更しても実引数が影響を受けないならa[0]=700と出力されるのではないかと思います。どうしてこう出力されるのか分かりません。参照情報が変わるからa[0]=200であると言うのならどうしてb[0]=200にならないのかも分かりません。

A 回答 (1件)

https://ufcpp.net/study/csharp/sp_ref.html#sec-b …
とかで説明されています。


「メソッドの仮引数をメソッド内で変更しても実引数には影響がない」
というのは
このプログラムの場合、仮引数bを 「変数b」として扱って
b=new int[10];
だの
b=null ;
とやっても「変数bが持っている参照情報が変わる」だけで、「呼び出し元のaが持っている参照情報」は変化しない、ということです。


ここで
「メソッドの仮引数が『参照しているオジュジェクト』をメソッド内で変更しても実引数には影響がない」
とは言っていないことに注意です。


参照情報をコピーしたときには、このような現象が起り得るので、注意が必要です。

-------
「b[0]=200にならないのか」
これは、仮引数云々以前の問題です。
プログラムに基本となる「実行順序」の話です。

メソッドが実行されると、仮引数には、実引数の値が入ります。
 この時点で
y=1000 // xの値
b={700,800,900} // aの値
 となっています。
console.writeline("y="+y);
console.writeline("b[0]="+b[0]);
 が実行されると「この時点でのy,bの値」を使って
y=1000
b[0]=700
 と出力されます。

 この後で、
y=100;
b[0]=200;
 としたところで、一度出力したものが勝手に書き変わったりはしません。
    • good
    • 0
この回答へのお礼

ありがとうございます。なんとなくわかりました。

お礼日時:2020/03/21 20:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!