Процедуры и функции – методы класса. Преподаватель Кривошеина А.В. ЧУО «Колледж бизнеса и права» Определение метода Метод — функциональный элемент класса, реализующий вычисления или другие действия. Методы определяют поведение класса и составляют его интерфейс. Метод – это конструкция в виде блока кода, которая выполняет некоторые действия, и имеет логическую смысловую нагрузку. Аналогом методов языка C#, являются математические функции. Синтаксис метода [ атрибуты ] [ спецификаторы ] тип имя ( [ параметры ] ) { тело_метода } Спецификаторы: new, public, protected, internal, protected internal, private, static, virtual, sealed, override, abstract, extern. Метод класса имеет непосредственный доступ к его полям. метод Main консольная программа на языке C# должна содержать как минимум один метод - метод Main, который является точкой входа в приложение: static void Main(string[ ] args) { } Пример метода class Program { static void Main(string[ ] args) { } static void SayHello() { Console.WriteLine("Hello"); } } Вызов метода Для вызова метода указывается его имя, после которого в скобках идут значения для его параметров (аргументы),если метод принимает параметры: имя_метода ([аргументы]); Вызов метода SayHello: Вызов метода метод SayHello using System; static void Main(string[ ] args) namespace HelloApp { { SayHello(); class Program Console.ReadKey(); { } static void SayHello() { } } Console.WriteLine("Hello"); } Hello – консольный вывод Возвращение значения Если метод имеет любой другой тип, отличный от void, то такой метод обязан вернуть значение этого типа. Для этого применяется оператор return, после которого идет возвращаемое значение: return возвращаемое_значение; Примеры методов с возвращаемым значением: static int Sum() static string Hello() { { return "Hello"; int x = 2; int y = 3; } int z = x + y; return z; } return x + y; class Program Результат метода, который возвращает значение, мы можем присвоить переменной или использовать иным образом в программе { static void Main(string[ ] args) { string message = Hello(); int s = Sum(); Console.WriteLine(message); // Hello Console.WriteLine(s); Console.ReadKey(); } … } // 5 Выход из метода Оператор return не только возвращает значение, но и производит выход из метода. static void SayHello() { int hour = 23; if (hour > 22) Однако мы можем использовать оператор return и в методах с типам void. { Типичная ситуация - в зависимости от опеределённых условий произвести выход из метода. { return; } else Console.WriteLine("Hello"); } } Сокращенная запись методов static void SayHello() { Console.WriteLine("Hello"); } static void SayHello() => Console.WriteLine("Hello"); Подобным образом мы можем сокращать и методы, которые возвращают значение static string Hello() { static string Hello() => "Hello"; return "Hello"; } Параметры методов Параметры позволяют передать в метод некоторые входные данные: static int Sum(int x, int y) { return x + y; } При вызове данного метода нам обязательно надо передать на место этих параметров два числа: static void Main(string[ ] args) { int result = Sum(10, 15); Console.WriteLine(result); // 25 Console.ReadKey(); } Параметры методов 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); Console.WriteLine(result); // 90 Console.ReadKey(); } Необязательные параметры Для таких параметров необходимо объявить значение по умолчанию. После необязательных параметров все последующие параметры также должны быть необязательными: Так как последние два параметра объявлены как необязательные, то мы можем при вызове аргументы для них (один из них или оба) опустить: static int OptionalParam(int x, int y, int z=5, int s=4) { static void Main(string[ ] args) OptionalParam(2, 3); { OptionalParam(2,3,10); return x + y + z + s; 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#: по значению и по ссылке. Наиболее простой способ передачи параметров представляет передача по значению, по сути это обычный способ передачи параметров. Передача параметров по значению class Program { static void Main(string[ ] args) { Sum(10, 15); // параметры передаются по значению Console.ReadKey(); } static int Sum(int x, int y) { return x + y; } } Передача параметров по ссылке и модификатор ref static void Main(string[ ] args) { int x = 10; int y = 15; Addition(ref x, y); // вызов метода Console.WriteLine(x); // 25 Console.ReadLine(); } // параметр x передается по ссылке static void Addition(ref int x, int y) { x += y; } Отличия При передаче по значению метод получает не саму переменную, а ее копию. При передаче параметра по ссылке метод получает адрес переменной в памяти. И, таким образом, если в методе изменяется значение параметра, передаваемого по ссылке, то также изменяется и значение переменной, которая передается на его место. Пример передачи параметра по значению static void Main(string[ ] args) { int a = 5; Console.WriteLine($"Начальное значение переменной a = {a}"); IncrementVal(a); Console.WriteLine($"Переменная a после передачи по значению равна {a}"); Консольный вывод: Начальное значение переменной a = 5 IncrementVal: 6 Console.ReadKey(); } static void IncrementVal(int x) { x++; Console.WriteLine($"IncrementVal: {x}"); } Переменная a после передачи по значению равна = 5 Пример передачи параметра по ссылке static void Main(string[] args) { int a = 5; Console.WriteLine($"Начальное значение переменной a = {a}"); IncrementRef(ref a); Console.WriteLine($"Переменная a после передачи ссылке равна = {a}"); Консольный вывод: Начальное значение переменной a = 5 IncrementRef: 6 Console.ReadKey(); } static void IncrementRef(ref int x) { x++; Console.WriteLine($"IncrementRef: {x}"); } Переменная a после передачи по ссылке равна = 6 Выходные параметры. Модификатор out Выше мы использовали входные параметры. Но параметры могут быть также выходными. Чтобы сделать параметр выходным, перед ним ставится модификатор out: static void Sum(int x, int y, out int a) { a = x + y; } Здесь результат возвращается не через оператор return, а через выходной параметр. Использование в программе: static void Main(string[ ] args) { int x = 10; int z; Sum(x, 15, out z); Console.WriteLine(z); Console.ReadKey(); } как и в случае с ref ключевое слово out используется как при определении метода, так и при его вызове static void Main(string[ ] args) { int x = 10; int area; Мы можем вернуть из метода не один вариант, а несколько int perimetr; GetData(x, 15, out area, out perimetr); Console.WriteLine("Площадь : " + area); Console.WriteLine("Периметр : " + perimetr); Console.ReadKey(); } static void GetData(int x, int y, out int area, out int perim) { area= x * y; perim= (x + y)*2; } Вместо: int x = 10; int area; int perimetr; GetData(x, 15, out area, out perimetr); Console.WriteLine($"Площадь : {area}"); Console.WriteLine($"Периметр : {perimetr}"); Мы можем написать: int x = 10; GetData(x, 15, out int area, out int perimetr); Console.WriteLine($"Площадь : {area}"); Console.WriteLine($"Периметр : {perimetr}"); Входные параметры. Модификатор in Кроме выходных параметров с модификатором out метод может использовать входные параметры с модификатором in. Модификатор in указывает, что через данный параметр аргумент будет передаваться в метод по ссылке, однако внутри метода значение параметра нельзя будет изменить. Пример (входные параметры с модификатором in) static void GetData(in int x, int y, out int area, out int perim) { // x = x + 10; – нельзя изменить значение параметра x y = y + 10; area = x * y; perim = (x + y) * 2; } Переменные, передаваемые в качестве аргументов in, требуется инициализировать перед передачей в метод Массив параметров и ключевое слово params static void Addition(params int[ ] integers) { int result = 0; for (int i = 0; i < integers.Length; i++) static void Main(string[ ] args) { { Addition(1, 2, 3, 4, 5); result += integers[i]; } int[ ] array = new int[ ] { 1, 2, 3, 4, 5, 6, 7 }; Console.WriteLine(result); Addition(array); Addition(); } Console.ReadLine(); } Массив параметров и ключевое слово params Сам параметр с ключевым словом params при определении метода должен представлять одномерный массив того типа, данные которого мы собираемся использовать. При вызове метода на место параметра с модификатором params мы можем передать как отдельные значения, так и массив значений, либо вообще не передавать параметры. Если же нам надо передать какие- то другие параметры, то они должны указываться до параметра с ключевым словом params. Также этот способ передачи параметров надо отличать от передачи массива в качестве параметра. Вопросы и упражнения Какой результат работы будет у следующей программы и почему: class Program { static void Main(string[ ] args) { int x; Increment(ref x); Console.WriteLine(x); Console.ReadKey(); } static void Increment(ref int x) { x++; } } Какое число (или какие числа) выведет на консоль следующая программа и почему: class Program { static void Main(string[ ] args) { int i = 0; Console.Write(i++ + Calculate(i)); Console.WriteLine(i); Console.ReadKey(); } public static int Calculate(int i) { Console.Write(i++); return i; } } Дан следующий метод: Какие из следующих вариантов представляют правильный способ вызова static void Display(params int[ ] numbers) данного метода (правильных { вариантов может быть int result = 0; несколько): for (int i = 0; i < numbers.Length; i++) 1. Display(); { 2. Display(1); result += numbers[i]; 3. Display(1, 2); } 4. Display(1, 2, 3); Console.WriteLine(result); 5. Display(new int[ ] { 1, 2, 3, 5 }); } Дан следующий метод: static void Display(int[ ] numbers) { int result = 0; for (int i = 0; i < numbers.Length; i++) { result += numbers[i]; } Console.WriteLine(result); } Какие из следующих вариантов представляют правильный способ вызова данного метода (правильных вариантов может быть несколько): 1. Display(); 2. Display(1); 3. Display(1, 2); 4. Display(1, 2, 3); 5. Display(new int[ ] { 1, 2, 3, 5 }); Домашнее задание: Павловская Т. А. «C#. Программирование на языке высокого уровня», стр.106–114; Троелсен Э. «Язык программирования C# 5.0 и платформа .NET 4.5», стр.146–156.