Преди да се
прочете тази статия трябва добре да се осмисли разликата между стойностни и
референтни типове (или парамети както ще използвам в статията тъй като става
въпрос за методи) и типове подадени по стойност и по референция.В първия случай
просто става въпрос за различни типове параметри, а във втория за тяхното
използване в методите!
Също така трябва
да се знае какво точно означава:
Myclass a = new Mycalss();
А то означава
следните три неща:
1. Създаване на
референция (Myclass a)
2. Създаване
на обект (new Myclass();)
3.
Насочване на референцията към обекта (=).
Тук напрактика се
правят два записа в паметта един в стека и един в хиипа, които са две съвсем
различни неща на съвсем различни места, въпреки че едното гледа към другото.
ПОДАВАНЕ НА ПАРАМЕТЪР
ПО СТОЙНОСТ
Референтни
типове(параметри)
Когато се подават
параметри на даден метод те по принцип биват подавани по стойност (въпреки, че
това са референеции).За да бъдат подадени като такива не
се изсиква
поставянето на ключова дума пред параметъра.Подаденият по стойност параметър
води до заделяне на ново място за него или с други думи се направи копие на
подадения параметър в стека. Затова промяна на неговата стойност при изпълнение
на метода няма да прдизвика промяна на оригиналния параметър подаден на
метода.Просто ще се пренасочи референцията в друга посока.Това може означава че
на параметъра ще се зададе стойност null или ще се посочи
друго място в хиипа съответно друг обект (от същият тип разбира се).Но ако
извикаме метод на подадения параметър то ние викаме метод на обеката, към който
сочат и оригиналния параметър и този, който се използва в метода.Ето защо това
ще доведе до промяна на обекта и ще рефлектира върху оригиналният параметър!!!
Стойностни
типове(параметри)
Какво би се
получило ако параметърът подаден на метода е от стойностен тип?
Тук подавеме
стойностен тип и методът прави копие на стойноста му (Важно е да припомня, че
стойностния тип представлява самите данни а не връзка към тях???????). Ето защо
всяка промяната на подадената стойност не води до промяна на оригиналната
стойност. Ако извикаме метод на стойностния тип той няма да промени
оригиналният обект както би се случило при референтните типове, които биха се
обърнат към обект в хиипа.
Общо казано
подаването на параметър на функция означва неговото копиране така, че
оригиналният паранетър да не може да бъде променен в
процеса на
изпълнение на фукцията.
ПОДАВАНЕ НА
ПАРАМЕТЪР ПО РЕФЕРЕНЦИЯ
Референтни типове
За да се подаде
параметър по референция пред параметъра се слага ключова дума ref.Разликата
от подаването по стойност е че тук не се прави копие на параметъра а се работи
с подадения.Това означава, че работим с оригиналния параметър и всяка промяна
направена върху параметъра в метода ще доведе до промяна на подадения оригинален
параметър.Например ако методът променя посоката на параметъра на null или
посочва нов обект (= new Myclass(); като естествно
параметъра също е MyClass()) това ще доведе до
промяна на оригиналния параметър който също ще бъде насочен към null или
към Myclass();
Стойностни типове
Логично при
подаването на стойностен тип по референция подаваме самите данни и методът
работи със самият оригинален обект.Няма копиране - подаваш оригинала!!!
Дано написъното
не е объркващо.Темата не е слжожна, но понятията лесно могат да бъдат
объркани.Например можем да имаме стойностно податане на референтен тип и
референтно подаване на стойностен тип.Или да кажем, ако не е оказно друго
подавантето на обект става стойностно по референция или подаването на
референция става стойностно.