GiveDollar
Personをstructで作って、 次のようなメソッドを用意したのだが、
struct Person { public int dollar; public string name; public Person(string name, int dollar) { this.name = name; this.dollar = dollar; } public void GiveDollar(int d, Person p) { p.dollar += d; dollar -= d; } ... } ... Person Alice = new Person("Alice", 100); Person Bob = new Person("Bob", 100); Alice.GiveDoller(30, Bob);
dollar -= d;は効くのだが、p.dollar += d;は効果がない。 上の例でいうと、Aliceの所持金は70ドルに減るが、 Bobは100ドルのままとなる。 つまり構造体のインスタンスを引数に渡すと、値渡しになるので、pはコピーが渡されているから、 GiveDollarを呼んだ側には影響しないのだった。 なので、Personをclassで定義すれば引数は参照渡しだから、こちらはOKなのである。 XNAはクラスよりも構造体を多用する傾向があるので、 (もとJavaユーザ的には)あまりなれてない構造体を使ってみたのだが、こんなところに陥し穴があるとは。 深いね。