Итак, я готовлю урок по передаче по ссылке и проверяю свой пример ... Здесь у меня есть следующий пример кода:
public static void Main(string[] args)
{
int x = 4;
Add(x, 4);
Console.WriteLine("x = {0}", x);
Player player = new Player("Bob");
Console.WriteLine("Your name is {0}", player.Name);
ChangeName(player, "Cobb");
Console.WriteLine("Your name is {0}", player.Name);
}
public static void Add(int x, int y)
{
x = x + y;
Console.WriteLine("(in method) x = {0}", x);
}
public static void ChangeName(Player player, string name)
{
player.Name = name;
Console.WriteLine("(in method) Your name is {0}", player.Name);
}
Первый метод, Add(x, 5);
, работает как положено однако метод ChangeName изменяет объект проигрывателя обратно в область видимости метода Main и выводит примерно так:
(in method) x = 8
x = 4
Your name is Bob
(in method) Your name is Cobb
Your name is Cobb
Мне любопытно, почему это так, в течение многих лет я учил, что свойство Name объекта Экземпляр проигрывателя не должен изменяться, когда он возвращается в область действия метода Main. Я только что учил этому неправильно навсегда? Ключевое слово ref
необходимо только для прямой передачи примитивных типов данных? Если это так, то что, если мне явно нужна мелкая копия объекта в области действия метода?
Дополнительный контекст, в классе Player свойство Name определяется следующим образом:
public class Player
{
/// <summary>
/// This player's name.
/// </summary>
public string Name
{
get;
set;
}
...
}