Найти тему
Programmer

Основы программирования. Внутрь метода параметр копируется или передается напрямую!

Оглавление

Еще раз повторяем три основных и единственных в мире программирования способа передачи данных со входа на выход, два из которых являются шлюзовой операцией, а третий способ является приведением типа от одного к другому или серией идущих подряд таких приведений, который почти всегда происходит перед шлюзовыми операциями! Заодно проясним принцип закидывания внутрь параметров в методы и операторы.

Если вы хотите стать настоящим программистом, то вы на всю жизнь должны усвоить этот принцип передачи параметров при вызове внутрь в методы, функции или операторы, которые также являются статическими методами "под капотом". Эти принципы вам ясно и четко никто в мире не рассказывает, а они простые и я вам их ясно и четко публикую.

Итак, снова повторяю, что все параметры в методы, функции и операторы, как и в операторе "=" элементы справа налево, передаются шлюзовыми операциями, то есть тип элемента на входе функции или оператора всегда аналогичен типу элемента на их выходе!

То есть при шлюзовой операции копирования это будет нулевое, частичное или полное побитовое копирование с изменяемым входным параметром или неизменяемым, но по умолчанию копирование "под капотом" обычно является полным побитовым копированием элемента с входа на выход с неизменяемым параметром на входе.

А при шлюзовой операции передачи напрямую это будет передача объекта из памяти ЭВМ напрямую через "шлюз" со входа на выход, при этом на выходе переменной или объекту обычно дают какое-то местное другое имя, но можно передавать напрямую и под операторы или под ссылки и указатели (читайте статью о всех способах обращения к переменным).

Если вы при шлюзовой операции применяете приведение типа объекта на входе, то операция приведения типа (explicit или implicit) или серия подряд операций приведения типа происходит всегда перед шлюзовой операцией , так как при шлюзовой операции всегда один тип на входе и выходе, а приведение типа на входе получает один тип объекта, а на выходе всегда другой тип. После приведения типа почти всегда идут шлюзовые операции копирование или передача напрямую, потому что нет смысла проводить приведение типа или серию приведений и никуда затем не передавать новый объект нового типа.

Итак, при закидывании параметров в методы или операторы при их вызове по умолчанию происходит шлюзовая операция копирование , то есть берется переменная в скобках при вызове метода и создается ее полная копия (копирование по умолчанию) внутри метода, функции или оператора, а по завершении работы блока кода метода внутренняя копия внешней переменной уничтожается из памяти. Обычно копия параметра внутри метода создается в сверхбыстрой вечной памяти или "стеке".

Meth (45, 567.0, 100, vasja);

пример вызова метода обычным копированием внутрь параметров

При закидывании параметров в метод напрямую (в C# - ref, in, out) перед вызовом метода выше по коду во внешнем методе создаются новые переменные тех типов, которые закидываются в методе напрямую, а после работы кода метода созданные выше его вызова переменные и закинутые в него напрямую получают при выходе новые значения и используются до конца работы внешнего метода, то есть до конца области действия переменных.

int vasja = 7; double petja = 100.0;

Meth (ref vasja, out petja);

double x = vasja + petja;

пример вызова метода с передачей напрямую внутрь vasja и petja

В первом примере выше в метод передаются обычным способом (копирование) две константы и переменная vasja, в этом случае (C++, C#, Java) внутри тела метода создается временная копия этих трех переменных (хотя для примитивных типов умный компилятор даже копию не создает в реале, а только подразумевается), а после окончания работы метода временные копии (или временные переменные такого типа) уничтожаются из памяти. То есть переменная типа параметра создается на время работы метода внутри него!

А во втором случае при передаче напрямую (C#-ref, in, out) вы создаете переменные vasja и petja типа параметров метода выше по коду перед вызовом метода из внешнего метода, при этом эти же переменные закинутся в метод напрямую, отработают там внутри, возможно поменяют свои значения, а при выходе из метода во внешний метод до его конца можно использовать данные созданные выше переменные по их внешнему имени.

Понятно пояснил? То есть это и есть три типа захвата внешних данных в метод, про которые я описал в статье о подключении методов. Это захват переменных напрямую из кода выше внешнего метода, это передача параметров извне копированием внутрь при вызове, и это захват напрямую глобальных переменных в методы из своих классов, лежащих без классов с "улицы" или из других классов или библиотек. То есть всего три способа захвата внешних данных в методы и операторы! Запомните их навсегда!

Картинка в Telegraph

Ну и на картинке в Telegraph я постарался вам изобразить понятно передачу данных внутрь метода копированием с созданием внутренней временной копии и передачей напрямую из кода выше вызова функции. Третий способ захвата глобальных переменных в метод извне также производится напрямую, только в этом случае переменные создаются в классах или "на улице", а не выше вызова функции по коду внешнего метода, то есть разница только в месте создания переменных, а в метод они передаются напрямую и в одном и другом случае. Просто в случае внешнего захвата глобальных переменных вам не нужно их указывать в параметрах функции, ведь они передаются внутрь метода автоматически всегда по своему имени, классу и пространству имен. Только если переменная закрыта приватными модификаторами в чужом классе или сборке, то тогда к ней нельзя получить доступ напрямую из ваших методов.

В параметрах функции данные передаются либо копированием во внутрь с созданием внутри метода локальных переменных того же типа, либо передачей напрямую из кода выше вызова, а глобальные открытые переменные (в том числе из своего класса) передаются в метод без всяких параметров автоматом.

Картинку с комментариями по трем способам захвата данных в методы вы можете увидеть по ссылке в Дзен:

https://dzen.ru/media/id/633fe6fd9854f402f47acc5b/kartinka-k-state-o-parametrah-metoda-tri-sposoba-zahvata-dannyh-v-metod-izvne-636eb4f57455de0b6d7ef14f

Подписывайтесь, ставьте лайки...