Почему бокс и распаковка не работают с методами? - PullRequest
0 голосов
/ 17 июня 2020
class Program
{
  public static void FunnyMethod(object a)
  { a = 5; }
  public static void NotSoFunnyMethod(int a)
  { a = 5; }

  public static void main(string[] args)
  {
    int number = 10;
    object obj = number;

    FunnyMethod(obj);
     Console.WriteLine(obj);

    NotSoFunnyMethod((int)obj);
    Console.WriteLine(obj);
  }
}
output : 10 in both cases

В основном мне немного любопытно. Когда вы создаете экземпляр object и пытаетесь работать с ним вне области действия основного метода, он не возвращает окончательное значение (5) через другие методы, даже если это объект ссылочного типа.

Почему?

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Если бы int было свойством объекта, это сработало бы (потому что обе ссылки указывали бы на один и тот же объект в куче).

Int (даже как объект) неизменяем (как строка), поэтому с «a = 5» вы просто создаете новый объект и стираете ссылку на ваш параметр. (Но в коде вызова все еще есть предыдущая ссылка).

Вы можете делать все, что хотите, с ключевым словом ref:

    public static void FunnyMethod(ref object a)
    { a = 5; }
    public static void NotSoFunnyMethod(int a)
    { a = 5; }

    public static void Main(string[] args)
    {
        int number = 10;
        object obj = number;

        FunnyMethod(ref obj);
        Console.WriteLine(obj);

        NotSoFunnyMethod((int)obj);
        Console.WriteLine(obj);
    }
1 голос
/ 17 июня 2020

Думаю, это не имеет ничего общего с боксом, он будет вести себя так же и для объектов.

Когда вы передаете ссылку на метод, ее нельзя изменить в этом методе. Это из-за того, что параметры передаются по значению, вы можете изменить его на ссылку.

Вы можете использовать ключевое слово ref, чтобы получить 5 в обоих случаях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...