C# Похоже, что объекты передаются по ссылке без ключевого слова ref? (любопытство) - PullRequest
0 голосов
/ 22 апреля 2020

Итак, я готовлю урок по передаче по ссылке и проверяю свой пример ... Здесь у меня есть следующий пример кода:

    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;
    }
...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...