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

Параметры методов

Параметры позволяют передать в метод некоторые входные данные. Например, определим метод, который складывает два числа:

static int Sum(int x, int y) { return x + y; }

Метод Sum имеет два параметра: x и y. Оба параметра представляют тип int. Поэтому при вызове данного метода нам обязательно надо передать на место этих параметров два числа.

class Program { static void Main(string[] args) { int result = Sum(10, 15); Console.WriteLine(result); // 25 Console.ReadKey(); } static int Sum(int x, int y) { return x + y; } }

При вызове метода Sum значения передаются параметрам по позиции. Например, в вызове Sum(10, 15) число 10 передается параметру x, а число 15 - параметру y. Значения, которые передаются параметрам, еще называются аргументами. То есть передаваемые числа 10 и 15 в данном случае являются аргументами.

Иногда можно встретить такие определения как формальные параметры и фактические параметры. Формальные параметры - это собственно параметры метода (в данном случае x и y), а фактические параметры - значения, которые передаются формальным параметрам. То есть фактические параметры - это и есть аргументы метода.

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

class Program { static void Main(string[] args) { int a = 25; int b = 35; int result = Sum(a, b); Console.WriteLine(result); // 60 result = Sum(b, 45); Console.WriteLine(result); // 80 result = Sum(a+b+12,18); //"a+b+12" представляет значение параметра x Console.WriteLine(result); // 90 Console.ReadKey(); } static int Sum(int x, int y) { return x + y; } }

Если параметрами метода передаются значения переменных, которые представляют базовые примитивные типы (за исключением типа object), то таким переменным должно быть присвоено значение. Например, следующая программа не скомпилируется:

class Program { static void Main(string[] args) { int a; int b = 9; Sum(a, b); //Ошибка - переменной a не присвоено  значение Console.ReadKey(); } static int Sum(int x, int y) { return x + y; } }

При передаче значений параметрам важно учитывать тип параметров: между аргументами и параметрами должно быть соответствие по типу. Например:

class Program { static void Main(string[] args) { Display("Tom", 24); // Name: Tom Age: 24 Console.ReadKey(); } static void Display(string name, int age) { Console.WriteLine($"Name: {name} Age: {age}"); } }

В данном случае первый параметр метода Display представляет тип string, поэтому мы должны передать этому параметру значение типа string, то есть строку. Второй параметр представляет тип int, поэтому должны передать ему целое число, которое соответствует типу int.

Другие данные параметрам мы передать не можем. Например, следующий вызов метода Display будет ошибочным:

Display(45, "Bob"); // Ошибка! несоответствие значений типам параметров

Необязательные параметры

По умолчанию при вызове метода необходимо предоставить значения для всех его параметров. Но C# также позволяет использовать необязательные параметры. Для таких параметров нам необходимо объявить значение по умолчанию. Также следует учитывать, что после необязательных параметров все последующие параметры также должны быть необязательными:

static int OptionalParam(int x, int y, int z=5, int s=4) { return x + y + z + s; }

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

static void Main(string[] args) { OptionalParam(2, 3); OptionalParam(2,3,10); Console.ReadKey(); }

Именованные параметры

В предыдущих примерах при вызове методов значения для параметров передавались в порядке объявления этих параметров в методе. Но мы можем нарушить подобный порядок, используя именованные параметры:

static int OptionalParam(int x, int y, int z=5, int s=4) { return x + y + z + s; } static void Main(string[] args) { OptionalParam(x:2, y:3); //Необязательный параметр z использует значение по умолчанию OptionalParam ( y :2, x :3, s :10); Console.ReadKey(); }

 


 


IncrementVal: 6

Переменная a после передачи по значению равна = 5

При вызове метод IncrementVal получает копию переменной a и увеличивает значение этой копии. Поэтому в самом методе IncrementVal мы видим, что значение параметра x увеличилось на 1, но после выполнения метода переменная a имеет прежнее значение - 5. То есть изменяется копия, а сама переменная не изменяется.

Второй пример - аналогичный метод с передачей параметра по ссылке:

class Program { static void Main(string[] args) { int a = 5; Console.WriteLine("Начальное значение переменной a="+a); //Передача переменных по ссылке //После выполнения этого кода a=6, так как мы передали саму переменную IncrementRef(ref a); Console.WriteLine( "Переменная a после передачи  ссылке равна = " + a); Console.ReadKey(); } // передача по ссылке static void IncrementRef(ref int x) { x++; Console.WriteLine( "IncrementRef: " + x); } }

 

Консольный вывод:

Начальное значение переменной a = 5

IncrementRef: 6

Переменная a после передачи по ссылке равна = 6

В метод IncrementRef передается ссылка на саму переменную a в памяти. И если значение параметра в IncrementRef изменяется, то это приводит и к изменению переменной a, так как и параметр и переменная указывают на один и тот же адрес в памяти.

Параметры методов

Параметры позволяют передать в метод некоторые входные данные. Например, определим метод, который складывает два числа:

static int Sum(int x, int y) { return x + y; }

Метод Sum имеет два параметра: x и y. Оба параметра представляют тип int. Поэтому при вызове данного метода нам обязательно надо передать на место этих параметров два числа.

class Program { static void Main(string[] args) { int result = Sum(10, 15); Console.WriteLine(result); // 25 Console.ReadKey(); } static int Sum(int x, int y) { return x + y; } }

При вызове метода Sum значения передаются параметрам по позиции. Например, в вызове Sum(10, 15) число 10 передается параметру x, а число 15 - параметру y. Значения, которые передаются параметрам, еще называются аргументами. То есть передаваемые числа 10 и 15 в данном случае являются аргументами.

Иногда можно встретить такие определения как формальные параметры и фактические параметры. Формальные параметры - это собственно параметры метода (в данном случае x и y), а фактические параметры - значения, которые передаются формальным параметрам. То есть фактические параметры - это и есть аргументы метода.

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

class Program { static void Main(string[] args) { int a = 25; int b = 35; int result = Sum(a, b); Console.WriteLine(result); // 60 result = Sum(b, 45); Console.WriteLine(result); // 80 result = Sum(a+b+12,18); //"a+b+12" представляет значение параметра x Console.WriteLine(result); // 90 Console.ReadKey(); } static int Sum(int x, int y) { return x + y; } }

Если параметрами метода передаются значения переменных, которые представляют базовые примитивные типы (за исключением типа object), то таким переменным должно быть присвоено значение. Например, следующая программа не скомпилируется:

class Program { static void Main(string[] args) { int a; int b = 9; Sum(a, b); //Ошибка - переменной a не присвоено  значение Console.ReadKey(); } static int Sum(int x, int y) { return x + y; } }

При передаче значений параметрам важно учитывать тип параметров: между аргументами и параметрами должно быть соответствие по типу. Например:

class Program { static void Main(string[] args) { Display("Tom", 24); // Name: Tom Age: 24 Console.ReadKey(); } static void Display(string name, int age) { Console.WriteLine($"Name: {name} Age: {age}"); } }

В данном случае первый параметр метода Display представляет тип string, поэтому мы должны передать этому параметру значение типа string, то есть строку. Второй параметр представляет тип int, поэтому должны передать ему целое число, которое соответствует типу int.

Другие данные параметрам мы передать не можем. Например, следующий вызов метода Display будет ошибочным:

Display(45, "Bob"); // Ошибка! несоответствие значений типам параметров

Необязательные параметры

По умолчанию при вызове метода необходимо предоставить значения для всех его параметров. Но C# также позволяет использовать необязательные параметры. Для таких параметров нам необходимо объявить значение по умолчанию. Также следует учитывать, что после необязательных параметров все последующие параметры также должны быть необязательными:

static int OptionalParam(int x, int y, int z=5, int s=4) { return x + y + z + s; }

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

static void Main(string[] args) { OptionalParam(2, 3); OptionalParam(2,3,10); Console.ReadKey(); }

Именованные параметры

В предыдущих примерах при вызове методов значения для параметров передавались в порядке объявления этих параметров в методе. Но мы можем нарушить подобный порядок, используя именованные параметры:

static int OptionalParam(int x, int y, int z=5, int s=4) { return x + y + z + s; } static void Main(string[] args) { OptionalParam(x:2, y:3); //Необязательный параметр z использует значение по умолчанию OptionalParam ( y :2, x :3, s :10); Console.ReadKey(); }

 


 


Передача параметров по ссылке и значению. Выходные параметры

Существует два способа передачи параметров в метод в языке C#: по значению и по ссылке.

Дата: 2019-12-09, просмотров: 184.