618.94K
Category: programmingprogramming

Методы. Что такое метод?

1.

Методы

2.

Что такое метод?
В контексте объектно-ориентированного
программирования, метод – это
подпрограмма.
А подпрограмма, в свою очередь – это
фрагмент программы, который написать
нужно один раз, а использовать его
можно многократно (для выполнения
однотипных действий).

3.

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

4.

Методы
Мы уже знакомы с методом «Main» в главном файле программы.
Это, так называемая точка входа в программу, главный метод
наших программ.
Этот метод, Visual Studio сгенерировала сама, давайте вспомним,
как он выглядит в исходном состоянии (сразу после создания
нового проекта).
class Program
{
static void Main(string[] args)
{
}
}
Метод «Main» относится
к классу «Program» (т.е.
находится внутри класса
«Program«).
Что такое классы в C#?
Класс – это описание некого типа данных,
который характеризуется набором представляемых данных
и набором возможных операций над ними.

5.

Разберем подробно заголовок метода Main
static void Main(string[] args)
{
//Тело метода
}
//Заголовок метода
//Тело метода
• Ключевое слово static обозначает, что метод относится ко всему классу.
• Ключевое слово void, в этом месте, указывается тип возвращаемого методом
значения.
Что это значит?
Это значит, что выполнив какую-то работу, метод может вернуть её результат, а
мы можем сохранить его в какой-либо переменной (и использовать для дальнейших
нужд).
А тип переменной, должен совпадать с типом возвращаемого значения!
• Название метода, в данном случае – это Main.
После названия идут круглые скобки, в которых определяются аргументы
метода. В этом случае – это «string[] args». Т.е. массив строк. Аргументы
метода – это входные данные, которые получает метод. Аргументы
метода в заголовке еще называют его формальными параметрами.

6.

Определение методов
Метод – это конструкция в виде блока кода,
которая выполняет некоторые действия, и имеет
логическую смысловую нагрузку.
Аналогом методов языка C#, являются
математические функции.
В некоторых языках программирования, разделяют функции и
процедуры.
В языке C#, такого разделения нет, хотя условно
функциями можно считать методы которые возвращают значения,
процедурами – методы, которые не возвращают значений.

7.

Синтаксис метода
заголовок
public static void Pause()
{
Console.ReadKey();
return;
}
Тело метода

8.

Синтаксис метода
<доступ> <возвр_тип> <имя метода>(<список параметров>)
{
//тело метода
}
<доступ> — это модификатор, который указывает, какие части программы
могут иметь доступ к методу. Модификатор не является обязательным,
если он отсутствует, то метод доступен только в пределах класса, в
котором он объявлен (private). Методы, объявленные как public, могут
быть вызваны кодом из любого места программы.
• private — наиболее ограничительный, допускающий доступ к методу только из
содержащего его класса или структуры
• public — доступ из любого фрагмента кода в рамках приложения
• protected — позволяет получить доступ из содержащего класса или из
производных классов
• internal — доступ из файлов внутри одной сборки
• static — указывает, что метод является статическим членом класса, а не
членом экземпляра конкретного объекта

9.

Синтаксис метода
<доступ> <возвр_тип> <имя метода>(<список параметров>)
{
//тело метода
}
<возвр_тип> - указывает тип данных, возвращаемых методом.
если метод не возвращает значения, то используется тип void;
static void Display(string name, int age)
{
Console.WriteLine($"Name: {name} Age: {age}");
}
если возвращает, то в теле метода должно присутствовать ключевое
слово return, после которого указывается возвращаемое значение(того
же типа что и тип метода);
static int Sum(int x, int y)
{
return x + y;
}

10.

Синтаксис метода
<доступ> <возвр_тип> <имя метода>(<список параметров>)
{
//тело метода
}
<имя метода> – это может быть любой действительный
идентификатор, не повторяющий имена, которыми были названы
другие члены класса в той же области видимости
static int Sum(int x, int y)
{
return x + y;
}
static void Display(string name, int age)
{
Console.WriteLine($"Name: {name} Age: {age}");
}

11.

Синтаксис метода
<доступ> <возвр_тип> <имя метода>(<список параметров>)
{
//тело метода
}
<список параметров> – необязательные параметры.
• список_параметров – последовательность пар, состоящих из
типа и идентификатора и разделенных запятыми.
• при отсутствии параметров список остается пустым.
static int Sum(int x, int y)
{
return x + y;
}
static void Print()
{
Console.WriteLine(“Приветик!!!”);
}
static void Display(string name, int age)
{
Console.WriteLine($"Name: {name} Age: {age}");
}

12.

Виды параметров
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();
}
Параметры, задаваемые в
описании метода,
называются формальными
параметрами (или просто
параметрами).
Параметры, используемые
при вызове метода,
называются фактическими
параметрами или
аргументами.

13.

Вызов метода
Для вызова метода указывается его имя, после которого в
скобках идут значения для его параметров
название_метода (значения_для_параметров_метода);
• если принимает параметры – то они перечисляются в скобках
• если не принимает параметры – то скобки пустые
static void Main(string[] args)
{
SayHello();
SayGoodbye();
Console.ReadKey();
}
static void SayHello()
{
Console.WriteLine("Hello");
}
static void SayGoodbye()
{
Console.WriteLine("GoodBye");
}
static void Main(string[] args)
{
int result = Sum(10, 15);
Console.WriteLine(result);//25
Console.ReadKey();
}

14.

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

15.

Все три метода вызываются в основном методе программы –
Main. Они имеют модификатор доступа static.
Первые два метода типа void, то
есть ничего не возвращают.
• PrintHelloWorld – вызывает
Console.WriteLine с текстовым
аргументом.
• PrintHello – принимает в
качестве аргумента текстовую
строку и после модификации
текста, передает его в другой
метод Console.WriteLine, который
выводит текст в консоль.
• Cube – принимает на вход целое
число, возводит его в куб и
возвращает результат.

16.

Примечание.
static void Print()
{
Console.WriteLine(“Приветик!!!”);
}
static int Sum(int x, int y)
{
return x + y;
}
static void Main(string[] args)
{
int result = Sum(10, 15);
Print();
Console.WriteLine(result);//25
Console.ReadKey();
}
Метод, не
возвращающий
значение,
вызывается
отдельным
оператором
Метод,
возвращающий
значение, – в составе
выражения в правой
части оператора
присваивания.

17.

Возврат значения
Метод может возвращать значение, какой-либо результат.
Методы с типом void не возвращают никакого
значения. Они просто выполняют некоторые
действия.

18.

Возврат значения
Если метод имеет любой другой тип, отличный от void, то
такой метод обязан вернуть значение этого типа.
Для этого применяется оператор return, после которого
идет возвращаемое значение

19.

Оператор return - Выход из метода
Оператор return завершает выполнение метода, и может
возвращать значение. Инструкции которые размещены
после return игнорируются.
Если метод имеет тип void – оператор return может
использоваться для преждевременного выхода:
Например:

20.

Когда использовать методы?
Если часть кода повторяется два и больше раз, то есть смысл вынести
инструкции в отдельный метод.
Пример ввода элементов массива с клавиатуры:
Код для заполнения массивов дублируется, по этому можно
создать метод для заполнения массива значениями,
которые вводятся с клавиатуры:

21.

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

22.

ПАРАМЕТРЫ МЕТОДОВ

23.

Параметры методов
При вызове метода выполняются следующие действия:
1) Вычисляются выражения, стоящие на месте аргументов.
2) Выделяется память под параметры метода в соответствии с их
типом.
3) Каждому из параметров сопоставляется соответствующий аргумент
(аргументы как бы накладываются на параметры и замещают их).
4) Выполняется тело метода.
5) Если метод возвращает значение, оно передается в точку вызова;
если метод имеет тип void, управление передается на оператор,
следующий после вызова.
6) При этом проверяется соответствие типов аргументов и
параметров и при необходимости выполняется их преобразование.
При несоответствии типов выдается диагностическое сообщение.

24.

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

25.

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

26.

Способы передачи параметров
В C# для обмена данными между вызывающей и
вызываемой функциями(методами) предусмотрено
четыре типа параметров:
1) параметры - значения;
2) параметры - ссылки – описываются с помощью
ключевого слова ref;
3) выходные параметры – описываются с помощью
ключевого слова out;
4) массив параметров – описывается с помощью
ключевого слова params.

27.

Параметры – значения
Параметр - значение описывается в заголовке метода
следующим образом:
тип имя
Пример заголовка метода, имеющего один параметрзначение целого типа: void P( int x)
Параметр x представляет собой локальную переменную, которая
получает свое значение из вызывающей функции при вызове метода. В
метод передается копия значения аргумента.
Механизм передачи следующий:
Из ячейки памяти, в которой хранится переменная, передаваемая в метод,
берется ее значение и копируется в специальную область памяти – область
параметров.
Метод работает с этой копией, следовательно, доступа к ячейке, где хранится
сама переменная, не имеет.
По завершении работы метода область параметров освобождается. Таким
образом, для параметров- значений используется передача по значению.
Этот способ годится только для величин, которые не должны
измениться после выполнения метода, то есть для его исходных данных.

28.

Параметры – значения (пример)
Для примитивных типов данных, передача параметров передача
параметров в метод, производиться по значению.
То есть в качестве аргумента передается копия данных.
В теле метода, мы можем изменять переменные параметров, при
этом изменения никак не влияют на переданные данные:

29.

Параметры – ссылки
Признаком параметра - ссылки является ключевое слово ref
перед описанием параметра:
ref тип имя
Пример заголовка метода, имеющего один параметр - ссылку
целого типа: void P( ref int x)
Механизм передачи следующий:
При вызове метода в область параметров копируется не значение аргумента,
а его адрес, и метод через него имеет доступ к ячейке, в которой хранится
аргумент.
Таким образом, параметры - ссылки передаются по адресу (чаще
употребляется термин «передача по ссылке»).
Метод работает непосредственно с переменной из вызывающей функции и,
следовательно, может ее изменить, поэтому если в методе требуется изменить
значения параметров, они должны передаваться только по ссылке.

30.

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

31.

Массив в качестве входного аргумента метода
Передать ссылку (адрес) вместо копии значения объекта можно и в случае, когда
в качестве входного аргумента используется массив, т.к. массив – это изначально
ссылочный объект и его значением является адрес памяти, где реально
размещены элементы массива
using System;
class metod
{
static void Main()
{
int[] a = { 1, 5, 10 };
float sreArif;
SREDNEE (a, out sreArif);
Console.WriteLine("Среднеарифметическое ={0:f5}", sreArif);
Console.WriteLine("a[0] = {0}", a[0]);
}
static void SREDNEE(int[] mass, out float sreArif)
{
sreArif = 0;
foreach( int i in mass)
{ sreArif += i;}
sreArif /= mass.Length;
mass[0] = 0;
}
}
31

32.

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

33.

Выходные параметры
Выше рассмотренные параметры имеют название
входные, поскольку передаются на вход метода.
Кроме этого, в языке C#, есть выходные параметры.
Для того, чтобы пометить параметр как выходной,
используется модификатор out.
Аргумент out похож на аргумент ref за исключением следующих
моментов:
• он не нуждается в присваивании значения перед входом в функцию;
• ему должно быть присвоено значение перед выходом из функции.
Модификатор out чаще всего применяется для получения из
метода нескольких возвращаемых значений.
Модификатор out указывается в
описании и при вызове метода

34.

Выходные параметры
static void P(int a, out int b)
{
a = 44; b = 33;
Console.WriteLine(" внутри метода {0} {1}", a, b);
}
static void Main(string[] args)
{
int a = 2, b;
P(a, out b);
Console.WriteLine(" после вызова {0} {1}", a, b);
Console.ReadLine();
}

35.

Массив параметров и
ключевое слово params
Ключевое слово params позволяет передать изменяемое количество
аргументов типа, указанного в создании аргумента метода, с
разделителями-запятыми, или массив аргументов указанного типа.
Можно также не отправлять аргументы.
При создании метода после ключевого слова params
дополнительные параметры не допускаются, и при создании метода
допускается только одно ключевое слово params.

36.

Пример
static void ShowArray(string name, params int[] array)
{
Console.Write(name);
for (int i = 0; i < array.Length; i++)
{
Console.Write("{0} ", array[i]);
}
Console.WriteLine();
}
static void Main()
{
int[] arr = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
ShowArray("Numbers: ", arr);
Console.WriteLine();
ShowArray("Numbers: ", 0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
Console.ReadKey();
}

37.

Используя ключевое слово params, можно передавать
неопределенное количество параметров
static void Addition(params int[] integers)
{
int result = 0;
for (int i = 0; i < integers.Length; i++)
{
result += integers[i];
}
Console.WriteLine(result);
}
static void Main(string[] args)
{
// Вариант 1
Addition(5, 6, 2, 1, 9);
// Вариант 2
int[] array = new int[] { 2, 7, 4, 9 };
Addition(array);
}
// Вариант 3
Addition();
На место параметра с
модификатором params
мы можем передать как
отдельные значения, так
и массив значений, либо
вообще не передавать
параметры.

38.

Использование params с другими параметрами
static void Addition(int x, string my, params int[] integers)
{
int result = 0;
for (int i = 0; i < integers.Length; i++)
{
result += integers[i];
}
Console.WriteLine(result);
}
static void Main(string[] args)
{
Addition(39, "aaaa", 5, 6, 2, 1, 9);
}
На заметку!
После параметра с
модификатором params мы
НЕ можем указывать
другие параметры.

39.

Используя ключевое слово params, можно передавать
неопределенное количество параметров
Пример с ошибкой:
static void Addition(params int[] integers, int x, string my)
{
...
}
Внимание!
После параметра с модификатором params
мы НЕ можем указывать другие параметры.

40.

Пример: Написать метод, который принимает переменное
количество целых чисел, возводит их в квадрат, и возвращает
массив значений.
using System;
class Program
{
static int[] Sqr(params int[] nums)
{
for (int i = 0; i < nums.Length; i++)
nums[i] *= nums[i];
return nums;
}
static void Main(string[] args)
{
Console.WriteLine(string.Join(", ", Sqr(1, 2, 3, 4, 5, 6))); Console.ReadLine();
}
}

41.

Пример : Написать программу метод которой, принимает на
вход массив и умножает все отрицательные элементы на
заданное в качестве параметра число.
using System;
class Program
{
static float[] Mult(float k, params float[] a)
{
for (int i = 0; i < a.Length; i++)
{
Console.Write($"{a[i],4}");
}
Console.WriteLine();
for (int i = 0; i < a.Length; i++)
{
if (a[i] < 0) { a[i] *= k;
}
return a;
}
static void Main(string[] args)
{
Console.WriteLine(string.Join(", ", Mult(-2, -7, -3, 0, 7, 9, 11)));
Console.ReadLine();
}
}

42.

Задание 1
Вычислить значение функции.
Даны действительные числа s, t.
Получить:

43.

Задание 2
Найти площадь заштрихованной фигуры.
Сторона квадрата = А, радиусы кругов
соответственно R1, R2, R3, R4.
Площадь круга через радиус
Площадь прямоугольника равна
произведению его смежных сторон

44.

Задания
«4»: Составить функцию, которая определяет сумму
всех чисел от 1 до N и привести пример ее
использования.
Пример:
Введите число:
100
сумма чисел от 1 до 100 = 5050
«5»: Составить функцию, которая определяет,
сколько зерен попросил положить на N-ую
клетку изобретатель шахмат (на 1-ую – 1 зерно,
на 2-ую – 2 зерна, на 3-ю – 4 зерна, …)
Пример:
Введите номер клетки:
28
На 28-ой клетке 134217728 зерен.
44

45.

Упрощенная запись методов
Начиная с C# 6.0, методы, в которых содержится всего
одна инструкция, можно записывать в сокращенной форме
посредством лямбда-выражений, это дает возможность
сократить количество написанного кода.
К примеру, математическую функцию y = x2 - 2/x, можно записать:
Использовав лямбда-выражение, код будет иметь следующий вид:

46.

Локальные функции
В версии C# 7.0, появилась возможность использовать
методы вложенные в метод, такие конструкции носят
название – локальные функции.
Они поддерживают
как классическую, так
и упрощенную форму
синтаксиса:

47.

Перегрузка методов
Перегрузка – это создание метода с таким же именем, но с
другими параметрами.
Раньше для подпрограмм, который делали похожие
действия, создавали функции с похожими, но разными именами.
В C# для этого можно создать функцию с одним именем, но с
разными параметрами. Это существенно облегчает труд
программистов, так как не требуется запоминать различные
имена функций и упрощает чтение программы.
Не смотря, на некоторую кажущую сложность в перегрузке нет
ничего сверхстественного. Попробуйте сами написать несколько
функций с одинаковыми названиями, но с разным количеством
параметров. При попытке обратится к перегруженной метода,
компилятор подскажет вам что существую разные
разновидности.

48.

Перегрузка методов
Перегрузка – это создание метода с таким же именем, но с
другими параметрами.
English     Русский Rules