Учебно-методический комплекс общее количество часов 58 ч. Лекции 28 ч


Download 2.46 Mb.
bet20/91
Sana19.10.2023
Hajmi2.46 Mb.
#1709453
TuriУчебно-методический комплекс
1   ...   16   17   18   19   20   21   22   23   ...   91
Bog'liq
Язык программирования C#

Передача параметров по значению

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


Приведем пример передаче параметров по значению.


static void TryToChange(double aValue)


{
Console.WriteLine("Вошли в TryToChange()");
aVslue = Math.Cos(aValue);
Console.WriteLine("Значение aValue в TryToChange(): " + aValue);
Console.WriteLine("Вышли из TryToChange()");
}

static void Main(string[] args)


{
double aValue = 0;
Console.WriteLine("Значение aValue до входа в TryToChange(): " +
aValue);
TryToChange(aValue);
Console.WriteLine("Значение aValue после выхода изTryToChange():"
+ aValue);
}
Лист. 5.6

В основной подпрограмме объявляется переменная aValue типа double, этой переменной присваивается значение 0, оно выводится. Затем эта переменная посылается, в качестве формального параметра в процедуру TryToChange(), в которой её значение изменяется и снова выводится. После выхода из процедуры TryToChange() значение переменной снова выводится.


Если запустить эту программу, то видно, что значение aValue после выхода из процедуры TryToChange() не изменилось.


5.4. Передача параметров по ссылке. Ключевые слова ref и out

При передаче параметров по ссылке в формальный параметр помещается сам фактический параметр (обычно это реализуется путём помещения в формальный параметр ссылки на фактический). При этом любое изменение формального параметра в подпрограмме отразится на фактическом параметре – оба параметра во время вызова подпрограммы суть одно и то же. Параметры, передаваемые по ссылке, дают возможность не только передавать параметры внутрь подпрограммы, но и возвращать вычисленные значения в точку вызова. Для этого параметру внутри подпрограммы просто присваивается нужное значение, и после возврата из подпрограммы переменная, использованная в качестве фактического параметра, получает это значение.


Для передачи параметров по ссылки используются два ключевых слова ref и out. При чем в отличии от большинства других языков и ref, и out должны предшествовать как формальному, так и фактическому параметру.
Оба этих ключевых слова заставляют параметры передаваться по ссылке. Разница между ними заключается в следующем:
При использовании ref переменная должна быть инициализирована до передачи в подпрограмму, но подпрограмма не обязана в как результат своей работы присвоить ей значение. Из этого следует, что подпрограмма может использовать переданную ей через ref переменную в правой части оператора присваивания, до присвоения этой переменной значения в самой подпрограмме.
При использовании же out переменная может быть не инициализирована до передачи в подпрограмму, но подпрограмма обязана в процессе своей работы присвоить ей значение.
Из этого следует, что подпрограмма не может использовать переданную ей через out переменную в правой части оператора присваивания, до присвоения этой переменной значения в самой подпрограмме.

Приведем пример передачи параметров по ссылке.


static int RefFunc(ref Double RefValue)


{
Console.WriteLine("Вошли в RefFunc()");
RefValue = Math.Cosh(RefValue);
Console.WriteLine("Значение RefValue в RefFunc(): " + RefValue);
Console.WriteLine("Выходим из RefFunc()");
return (int)RefValue;
}

static void OutProc(out Double OutValue1, out Double OutValue2)


{
Console.WriteLine("Вошли в OutProc()");
OutValue1 = 0;
OutValue2 = 1;
Console.WriteLine("Значение OutValue1 в OutProc(): " + OutValue1);
Console.WriteLine("Значение OutValue2 в OutProc(): " + OutValue2);
Console.WriteLine("Вышли из OutProc()");
}

static void Main(string[] args)


{
Double RefVale = 0;
Console.WriteLine("Значение RefVale до входа в RefFunc(): " + RefVale);
RefFunc(ref RefVale);
Console.WriteLine("Значение RefVale после выхода из RefFunc(): " + RefVale);

Double OutValue1, OutValue2;


OutProc(out OutValue1, out OutValue2);
Console.WriteLine("Значение OutValue1 после выхода в OutProc(): " + OutValue1);
Console.WriteLine("Значение OutValue2 после выхода из OutProc(): " + OutValue2);
}
Лист. 5.7

В первой сначала в программе определяется переменная RefVale типа double, этой переменной присваивается значение 0, затем это значение выводится. Затем эта перменная передается в функцию RefFunc() по ссылке ref, в этой функции значение переменной меняется и снова выводится. После выхода из функции значение снова выводттся.


Далее создаются две переменные типа double OutValue1 и OutValue2, значение этим переменным не присваивается. Затем они предаются в процедуру OutProc(), в ней им присваиваются значения, которые сразу же выводятся. После возврата из процедуры значения снова выводятся.
Если запустить эту программу, то видно, что значения, присвоенные переменным в подпрограмме, при их передаче по ссылке влияют на вызывающий метод.

Download 2.46 Mb.

Do'stlaringiz bilan baham:
1   ...   16   17   18   19   20   21   22   23   ...   91




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling