Способы передачи аргументов методу в c#

Аргументы метода c#

Доброго времени суток. На связи Алексей Гулынин. В прошлой статье мы познакомились с конструкциями get и set в С#. В данной статье я бы хотел рассказать о достаточно важной теме, которая необходима для понимания — это способы передачи аргументов методу в C#. В языке C# существует 2 способа передачи аргументов: передача по значению и передача по ссылке, и результат передачи объекта аргументу по ссылке будет отличаться от передачи значения простого типа.

Когда мы передаем аргумент по значению — значение фактически копируется в формальный параметр метода. Соответственно, изменения, которые вносятся в параметр метода никак не влияют на аргумент, используемый для вызова. В случае с передачей по ссылке — всё наоборот. Так как передаётся не значение, а ссылка на объект, то изменения, которые вносятся в параметр метода, влияют и на аргумент, используемый для вызова. Давайте разберем два примера, чтобы прояснить эту ситуацию.

1) Передача аргумента по значению:

using System;
namespace Test12
{
    class Test
    {
        public void ChangeSize(int i, int j)
        {
            i = j - 5;
            j = i + 4;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Test my_room = new Test();
            int i = 8; int j = 7;
            Console.WriteLine("Параметры i и j до изменения: {0} и {1}",i,j);
            my_room.ChangeSize(i, j);
            Console.WriteLine("Параметры i и j после изменения: {0} и {1}", i, j);
            Console.ReadLine();
        }
    }
}

Если запустить данный пример, то мы увидим, что параметры i и j как были равны 7 и 8 до применения метода ChangeSize(), так и остались. Давайте теперь разберем другой пример, когда аргумент передаётся по ссылке. В нашем случае объект создаётся командой new Test(). Когда выполняется данная команда, в оперативной памяти выделяется место для хранения объекта, а в переменную my_room копируется ссылка на этот объект. Таким образом, когда эта ссылка передаётся методу, принимающий её параметр будет ссылаться на тот же самый объект, что и аргумент.

Видоизменим нашу программу:

using System;

namespace Test12
{
    class Test
    {
        public int len;
        public int width;

        public Test(int i, int j)
        {
            len = i;
            width = j;
        }
        
        public void ChangeSize(Test t1)
        {
            t1.len = t1.len + 2;
            t1.width = t1.width + t1.len - 5;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Test my_room = new Test(8,7);
            Console.WriteLine("Параметры len и width до изменения: {0} и {1}",my_room.len,my_room.width);
            my_room.ChangeSize(my_room);
            Console.WriteLine("Параметры len и width после изменения: {0} и {1}", my_room.len, my_room.width);
            Console.ReadLine();
        }
    }
}

В данном случае мы видим, что значения len и width изменились, т.е. действия в методе ChangeSize() оказали влияние на объект, который использовался в качестве аргумента.

В данной статье вы узнали про способы передачи аргументов методу в C#, и теперь понимаете разницу между передачей по аргументу и передачей по ссылке.

На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.


Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *