Способы передачи аргументов методу в 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#, и теперь понимаете разницу между передачей по аргументу и передачей по ссылке.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.