A Player reference can start in the caller, be copied into a method parameter, and return to the caller. None of those copies creates another Player.
Suppose `first` refers to a Player named Jordan. The call `game.ChoosePlayer(first)` supplies that Player reference as an argument. Inside the method, `candidate` refers to Jordan's Player.
The method contains:
candidate.Name = "Selected";
return candidate;The first line changes the existing Player. The second returns a reference to that same Player.
If the caller stores the result in `chosen`, then `first` and `chosen` both reach the Player named Selected.
Inside the method, Locals displays the Player through `candidate`. After the return, the caller can see the same changed field through `first` and `chosen`. The parameter variable itself no longer exists after the call.
If the method instead assigned `candidate = new Player();` before returning, `chosen` would reach that new Player while `first` would still reach the original one. The returned reference follows the parameter's current destination.