° С#. Предаване на параметри към методи
° С#. Предаване на параметри към методи

Параметри на метода
В тази статия е лесно да се говори за характеристиките на предаване на параметри към методи. Разглеждаме предаването на параметри по стойност, по референция, както и чисто изходни параметри. Разглеждат се нюансите на работа със стойностни типове и референтни типове.
Повечето програмисти са изправени пред необходимостта да изучават тази тема, когато трябва да променят параметрите, предадени на методите (да не използват техните стойности, за да изчислят нещо, а именно да променят стойностите, така че тези промени да бъдат запазени след изпълнение на метода). И има редица нюанси, които изобщо не са очевидни за начинаещ програмист.
По подразбиране в езика за програмиране C# аргументите на методите се предават по стойност! Но трябва да запомните, че повечето от типовете, използвани от програмистите, все още са референтни типове и в резултат копие на референцията влиза в метода, така да се каже, така че можете да промените обекта, към който се отнася това копие (т.е. същия обект, към който се отнася оригиналната референция), но не можете да принудите оригиналната референция да сочи към друг обект. Но когато използвате типове стойности, ситуацията е различна и проблемите могат да изскочат веднага!
Нека си представим, че трябва да напишем метод, който взема две цели числа и разменя техните стойности, такъв метод може да изглежда по следния начин:
Изглежда, че няма нищо по-лесно, но на практика този метод няма да работи! Ако напишем код като следния:
Тогава ще видим нещо като този резултат от приложението:
Резултатът от метода Swap
И извикването на метода "Swap" ще бъде така:
И тогава резултатът от метода ще бъде така:
Резултатработа на модифицирания Swap метод
Както можете да видите, такива проблеми се решават чрез предаване на параметри към методите се решават доста просто, дори не трябваше да пренаписваме „логиката“ на метода. Но има една особеност, обектът, който се предава катоref -параметър на метода, трябва да бъде инициализиран преди методът да бъде извикан. Тези. код като този няма да се компилира:
Но има ситуации, когато преди да предадем обект на метод, който трябва да промени стойността си, ние не знаем как да инициализираме този обект (разбира се, можете да го инициализирате с всичко, но това е доста тромаво), в такива случаи можете да предадете параметър на метода не като референция, като чисто изходен параметър. Това се прави просто, ключовата думаref се заменя с ключовата думаout.
Представете си, че трябва да напишем метод, който трябва да вземе неинициализиран целочислен параметър, да го запълни с произволна стойност. Може да изглежда така:
Можете да използвате метода по следния начин:
Примерът, разбира се, е пресилен, би било възможно да не работите с изходни параметри, а просто да върнете произволна стойност с помощта на метода „SetValue“, но в реалната практика може да срещнете ситуация, че методът вече връща някаква стойност или трябва да попълните няколко изходни параметъра.