C#の参照型について 以下のようなプログラムの実行結果で、
C#の参照型について 以下のようなプログラムの実行結果で、 ChangeToAceメソッド内で、cardに新たにCardオブジェクトを代入しても、king変数自体は変化しない理由が理解できません。 参照型では、kingとcardの指し示すオブジェクトは実質同じなら、kingも同じく変化するように感じるのですが、なぜ、変化しないのでしょうか? using System; namespace Chap11_03 { class Program { static void Main() { var king = new Card(CardSuit.Spade, 13); Console.WriteLine($"Suit:{king.Suit}, Number:{king.Number}"); ChangeToAce(king); Console.WriteLine($"Suit:{king.Suit}, Number:{king.Number}"); } private static void ChangeToAce(Card card) { card.Number = 1; card = new Card(CardSuit.Club, 2); } } enum CardSuit { Club, Spade, Heart, Diamond } class Card { public CardSuit Suit { get; set; } public int Number { get; set; } public Card(CardSuit suit, int number) { Suit = suit; Number = number; } } }
ベストアンサー
Spade13 → Spade1 にはなるよね? 参照型というのは、簡単化して考えるとオブジェクトのアドレスが入っていると考えることができるのね。 (厳密には正しくない。) 最初、king には Spade13 のアドレスが入っていて ChangeToAce(king); で、king に入っていている値、つまり Spade13 のアドレスが渡される。(値渡し) なので、ChangeToAce() の中では card.Number = 1; で Spade13 → Spade1 になる。 次の card = new Card(CardSuit.Club, 2); は、それまで、Spade1(元Spade13) のアドレスが入っていていた card の値が上書きされて Club2 のアドレスになり、この時点で Spade1 を参照しなくなる。 ChangeToAce() の引数は値渡しなので(参照渡しではないので)、メソッドから戻ってきても king はSpade1(元Spade13)のアドレスのまま。
ちなみに、 ChangeToAce(ref Card card) にすると、king は Club2 になる。
質問者からのお礼コメント
なるほど! ChangeToAce()でcardのアドレスが別のものに上書きされるから、kingでは、元のアドレスを参照して値が変わらないのですね。 わかりやすい説明ありがとうございました
お礼日時:2020/11/27 0:05