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

Содержание

Слайд 2

Что такое метод? В контексте объектно-ориентированного программирования, метод – это подпрограмма.

Что такое метод?

В контексте объектно-ориентированного программирования, метод – это подпрограмма.


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

Когда использовать методы Если часть кода повторяется два и больше раз,

Когда использовать методы

Если часть кода повторяется два и больше раз, то

есть смысл вынести инструкции в отдельный метод.

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

Слайд 4

Методы Мы уже знакомы с методом «Main» в главном файле программы.

Методы

Мы уже знакомы с методом «Main» в главном файле программы. Это,

так называемая точка входа в программу, главный метод наших программ.
Этот метод, Visual Studio сгенерировала сама, давайте вспомним, как он выглядит в исходном состоянии (сразу после создания нового проекта).

class Program
{
    static void Main(string[] args)
    {
}
}

Что такое классы в C#?
Класс – это описание некого типа данных,
который характеризуется набором представляемых данных
и набором возможных операций над ними.

Метод «Main» относится к классу «Program» (т.е. находится внутри класса «Program«).

Слайд 5

static void Main(string[] args) { //Тело метода } Ключевое слово static

    static void Main(string[] args)
    {
  //Тело метода
    }

Ключевое слово static обозначает, что метод

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

//Тело метода

//Заголовок метода

Разберем подробно заголовок метода Main

Слайд 6

Определение методов Метод – это конструкция в виде блока кода, которая

Определение методов

Метод – это конструкция в виде блока кода, которая выполняет некоторые

действия, и имеет логическую смысловую нагрузку.

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

Аналогом методов языка C#, являются
математические функции.

Слайд 7

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

public static void Pause()

{
Console.ReadKey();
return;
}

заголовок

Тело метода

Синтаксис метода

Слайд 8

Синтаксис метода ( ) { //тело метода } — это модификатор,

Синтаксис метода

<доступ> <возвр_тип> <имя метода>(<список параметров>)
{
//тело метода
}

<доступ>

— это модификатор, который указывает, какие части программы могут иметь доступ к методу. Модификатор не является обязательным, если он отсутствует, то метод доступен только в пределах класса, в котором он объявлен (private). Методы, объявленные как public, могут быть вызваны кодом из любого места программы.

private — наиболее ограничительный, допускающий доступ к методу только из содержащего его класса или структуры
public — доступ из любого фрагмента кода в рамках приложения
protected — позволяет получить доступ из содержащего класса или из производных классов
internal — доступ из файлов внутри одной сборки
static — указывает, что метод является статическим членом класса, а не членом экземпляра конкретного объекта

Слайд 9

Синтаксис метода ( ) { //тело метода } - указывает тип

Синтаксис метода

<доступ> <возвр_тип> <имя метода>(<список параметров>)
{
//тело метода
}

<возвр_тип>

- указывает тип данных, возвращаемых методом.
если метод не возвращает значения, то используется тип void;
если возвращает, то в теле метода должно присутствовать ключевое слово return, после которого указывается возвращаемое значение(того же типа что и тип метода);

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

static void Display(string name, int age)
    {
        Console.WriteLine($"Name: {name}  Age: {age}");
    }

Слайд 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 Display(string name, int age)
    {
        Console.WriteLine($"Name: {name}  Age: {age}");
    }

static void Print()
{
  Console.WriteLine(“Приветик!!!”);
}

Слайд 12

Виды параметров Параметры, задаваемые в описании метода, называются формальными параметрами (или

Виды параметров

Параметры, задаваемые в описании метода, называются формальными параметрами (или просто

параметрами).
Параметры, используемые при вызове метода, называются фактическими параметрами или аргументами.

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;
    }

Слайд 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

Первые два метода типа void, то есть ничего не возвращают. PrintHelloWorld

Первые два метода типа void, то есть ничего не возвращают.
PrintHelloWorld – вызывает Console.WriteLine

с текстовым аргументом.
PrintHello – принимает в качестве аргумента текстовую строку и после модификации текста, передает его в другой метод Console.WriteLine, который выводит текст в консоль.
Cube – принимает на вход целое число, возводит его в куб и возвращает результат.

Все три метода вызываются в основном методе программы – Main. Они имеют модификатор доступа static.

Слайд 16

Примечание. Метод, не возвращающий значение, вызывается отдельным оператором Метод, возвращающий значение,

Примечание.

Метод, не возвращающий значение, вызывается отдельным оператором
Метод, возвращающий значение, – в

составе выражения в правой части оператора присваивания.

static void Print()
{
  Console.WriteLine(“Приветик!!!”);
}

static void Main(string[] args)
 {
   int result = Sum(10, 15);
Print();
   Console.WriteLine(result);//25
   Console.ReadKey();
 }

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

Слайд 17

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

Возврат значения

Метод может возвращать значение, какой-либо результат.

Методы с типом void не

возвращают никакого значения. Они просто выполняют некоторые действия.
Слайд 18

Возврат значения Если метод имеет любой другой тип, отличный от void,

Возврат значения

Если метод имеет любой другой тип, отличный от void, то

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

Оператор return - Выход из метода Оператор return завершает выполнение метода,

Оператор return - Выход из метода

Оператор return завершает выполнение метода, и

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

Когда использовать методы? Если часть кода повторяется два и больше раз,

Когда использовать методы?

Если часть кода повторяется два и больше раз, то

есть смысл вынести инструкции в отдельный метод.
Пример ввода элементов массива с клавиатуры:

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

Слайд 21

После этого, метод можно многократно использовать, для создания новых массивов целых

После этого, метод можно многократно использовать, для создания новых массивов целых

чисел:

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

Слайд 22

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

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

Слайд 23

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

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

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

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

Требования к параметрам методов Правила Главное требование при передаче параметров состоит

Требования к параметрам методов

Правила
Главное требование при передаче параметров состоит в

том, что
аргументы при вызове метода должны записываться в том же порядке, что и параметры в заголовке метода.
количество аргументов должно соответствовать количеству параметров.
на имена никаких ограничений не накладывается: имена аргументов могут как совпадать, так и не совпадать с именами параметров.
Слайд 25

Способы передачи параметров Существуют два способа передачи параметров: по значению и

Способы передачи параметров

Существуют два способа передачи параметров:
по значению и по

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

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

Способы передачи параметров

В C# для обмена данными между вызывающей и вызываемой

функциями(методами) предусмотрено
четыре типа параметров:
параметры - значения;
параметры - ссылки – описываются с помощью ключевого слова ref;
выходные параметры – описываются с помощью ключевого слова out;
массив параметров – описывается с помощью ключевого слова params.
Слайд 27

Параметры – значения Параметр - значение описывается в заголовке метода следующим

Параметры – значения

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

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

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

Слайд 28

Параметры – значения (пример) Для примитивных типов данных, передача параметров передача

Параметры – значения (пример)

Для примитивных типов данных, передача параметров передача параметров

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

Параметры – ссылки Признаком параметра - ссылки является ключевое слово ref

Параметры – ссылки

Признаком параметра - ссылки является ключевое слово 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;
}
}

Слайд 32

Выходные параметры Довольно часто возникает необходимость в методах, которые формируют несколько

Выходные параметры

Довольно часто возникает необходимость в методах, которые формируют несколько величин.

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

Выходные параметры Выше рассмотренные параметры имеют название входные, поскольку передаются на

Выходные параметры

Выше рассмотренные параметры имеют название входные, поскольку передаются на вход

метода.
Кроме этого, в языке C#, есть выходные параметры. Для того, чтобы пометить параметр как выходной, используется модификатор out.

Модификатор out указывается в описании и при вызове метода

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

Слайд 34

Выходные параметры static void P(int a, out int b) { a

Выходные параметры

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 позволяет передать изменяемое

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

Пример static void ShowArray(string name, params int[] array) { Console.Write(name); for

Пример

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

Используя ключевое слово 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 с другими параметрами

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

Используя ключевое слово 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

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

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

Задание 1

Слайд 43

Найти площадь заштрихованной фигуры. Сторона квадрата = А, радиусы кругов соответственно

Найти площадь заштрихованной фигуры.
Сторона квадрата = А, радиусы кругов соответственно R1,

R2, R3, R4.

Задание 2

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

Площадь круга через радиус

Слайд 44

Задания «4»: Составить функцию, которая определяет сумму всех чисел от 1

Задания

«4»: Составить функцию, которая определяет сумму всех чисел от 1 до

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

Упрощенная запись методов Начиная с C# 6.0, методы, в которых содержится

Упрощенная запись методов

Начиная с C# 6.0, методы, в которых содержится всего

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

К примеру, математическую функцию y = x2 - 2/x, можно записать:

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

Слайд 46

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

Локальные функции

В версии C# 7.0, появилась возможность использовать методы вложенные в

метод, такие конструкции носят название – локальные функции.

Они поддерживают как классическую, так и упрощенную форму синтаксиса:

Слайд 47

Перегрузка методов Перегрузка – это создание метода с таким же именем,

Перегрузка методов

Перегрузка – это создание метода с таким же именем, но

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