Содержание

Слайд 2

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

Определения

Метод — функциональный элемент класса, реализующий вычисления или другие действия.

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

©Павловская Т.А. (СПбГУ ИТМО)

double a = 0.1;
double b = Math.Sin(a);
Console.WriteLine(a);

Слайд 3

Синтаксис метода [модификаторы] тип_возвращаемого_значения название_метода ([параметры]) { // тело метода }

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

[модификаторы] тип_возвращаемого_значения название_метода ([параметры])
{
// тело метода
}
Все члены класса -

поля, методы, свойства - все они имеют модификаторы (спецификаторы) доступа. Модификаторы доступа позволяют задать допустимую область видимости для членов класса. То есть контекст, в котором можно употреблять данную переменную или метод.
Спецификаторы: new, public, protected, internal, protected internal, private, static, virtual, sealed, override, abstract, extern.
Слайд 4

Спецификаторы методов класса Между модификатором и типом может стоять ключевое слово

Спецификаторы методов класса

Между модификатором и типом может стоять ключевое слово

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

Статический метод вызывается через имя класса, а обычный — через имя экземпляра.

Слайд 5

Пример ©Павловская Т.А. (СПбГУ ИТМО) Пример: class Demo { double y;

Пример

©Павловская Т.А. (СПбГУ ИТМО)

Пример:
class Demo {
double y; // закрытое поле

класса
public void Sety( double z ) { // открытый метод класса
y = z;
}
}
… Demo x = new Demo(); // где-то в методе другого класса
x.Sety(3.12); … // вызов метода
Слайд 6

Тип_возвращаемого_результата определяет тип значения, возвращаемого методом. Это может быть любой тип,

Тип_возвращаемого_результата определяет тип значения, возвращаемого методом. Это может быть любой тип, включая

типы классов, создаваемые программистом.

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

Метод, который не возвращает значение, называют процедура (указан тип void и в теле метода отсутствует оператор return)

Метод, который возвращает значение, называют функция (возвращает значение, в теле метода присутствует оператор return)

Слайд 7

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

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

Слайд 8

using System; public class Program { static void Func() { Console.Write("x=

using System;
public class Program
{
static void Func()
{
Console.Write("x= ");
double x=double.Parse(Console.ReadLine());

double y = 1 / x;
Console.WriteLine("y({0})={1:f3}", x,y );
}
public static void Main()
{
Func();
Func();
}
}

using System;
public class Program
{
static double Func( double x) //дополнительный метод
{
return 1 / x; //Возвращаемое значение
}
public static void Main()
{
Console.Write("a=");
double a=double.Parse(Console.ReadLine());
Console.Write("b=");
double b=double.Parse(Console.ReadLine());
for (double x = a; x <= b; x += 0.5)
{
double y = Func(x); //вызов метода Func
Console.WriteLine("y({0:f1})={1:f2}", x, y);
}
}
}

Слайд 9

Имя_метода – идентификатор, заданный программистом с учетом требований, накладываемыми на идентификаторы

Имя_метода – идентификатор, заданный программистом с учетом требований, накладываемыми на идентификаторы в

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

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

Слайд 10

Примеры методов public void Sety(double z) { y = z; }

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

public void Sety(double z)
{
y = z;
}
public double

Gety()
{
return y;
}

©Павловская Т.А. (СПбГУ ИТМО)

x.Sety(3.12);
double t = x.Gety();

Если метод не принимает параметров, то все равно при вызове после имени метода должны присутствовать пустые круглые скобки (!!!)

Слайд 11

Вызов метода в другом классе

Вызов метода в другом классе

Слайд 12

using System; class Demo { static string s = "Hello!"; double

using System;
class Demo
{
static string s = "Hello!";
double y;

public double Gety() { return y; } // метод получения y
public void Sety(double y_){ y = y_; } // метод установки y
public static string Gets() { return s; } // метод получения s
}
public class Program
{
public static void Main()
{
double c = 1.66;
Demo x = new Demo();
x.Sety(0.12); // вызов метода установки y
Console.WriteLine(x.Gety()); // вызов метода получения y
Console.WriteLine(Demo.Gets()); // вызов метода получения поля s
x.Sety(c);
Console.WriteLine(x.Gety());
}
}
Слайд 13

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

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

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


Список аргументов при вызове как бы накладывается на список параметров, поэтому они должны попарно соответствовать друг другу.
Для каждого параметра должны задаваться его тип, имя и, возможно, вид параметра.
Слайд 14

Пример Тип возвращаемого результата Имя метода Список параметров Вызов метода

Пример

Тип возвращаемого результата

Имя метода

Список параметров

Вызов метода

Слайд 15

Сигнатура метода Имя метода вкупе с количеством, типами и спецификаторами его

Сигнатура метода

Имя метода вкупе с количеством, типами и спецификаторами его параметров

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

Сигнатура складывается из следующих аспектов:
Имя метода
Количество параметров
Типы параметров
Порядок параметров
Модификаторы параметров

названия параметров в сигнатуру НЕ входят

Сигнатура данного метода: Sum(int, int)

Слайд 16

Перегрузка методов Иногда возникает необходимость создать один и тот же метод,

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

Иногда возникает необходимость создать один и тот же метод, но

с разным набором параметров. И в зависимости от имеющихся параметров применять определенную версию метода. Такая возможность называется перегрузкой методов (method overloading).

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

Определение метода Add и его перегрузка

сигнатуры методов

Вызов в программе

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

Слайд 17

Пример Сигнатура у всех этих методов будет совпадать: Sum(int, int) Поэтому

Пример

Сигнатура у всех этих методов будет совпадать: Sum(int, int)
Поэтому данный набор

методов не представляет корректные перегрузки метода Sum и работать не будет.
Слайд 18

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

Вызов метода

Вычисляются выражения, стоящие на месте аргументов.
Выделяется память под параметры

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

©Павловская Т.А. (СПбГУ ИТМО)

Слайд 19

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

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

Слайд 20

Пример передачи параметров class Class1 { static int Max(int a, int

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

class Class1
{ static int Max(int a, int b)

// выбор макс. значения
{
if ( a > b ) return a;
else return b;
}
static void Main()
{
int a = 2, b = 4;
int x = Max( a, b ); // вызов метода Max
Console.WriteLine( x ); // результат: 4
short t1 = 3, t2 = 4;
int y = Max( t1, t2 ); // пар-ры совместимого типа
Console.WriteLine( y ); // результат: 4
int z = Max( a + t1, t1 / 2 * b ); // выражения
Console.WriteLine( z ); // результат: 5
}}

©Павловская Т.А. (СПбГУ ИТМО)

Слайд 21

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

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

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

по ссылке.
При передаче по значению метод получает копии значений аргументов, и операторы метода работают с этими копиями.
При передаче по ссылке (по адресу) метод получает копии адресов аргументов и осуществляет доступ к аргументам по этим адресам.
В С# четыре типа параметров:
параметры-значения;
параметры-ссылки (ref);
выходные параметры (out);
параметры-массивы (params).
Ключевое слово предшествует описанию типа параметра. Если оно опущено, параметр считается параметром-значением. Пример:
public int Calculate( int a, ref int b, out int c, params int[] d ) …

©Павловская Т.А. (СПбГУ ИТМО)

Слайд 22

Пример: параметры-значения и ссылки ref using System; namespace ConsoleApplication1 { class

Пример: параметры-значения и ссылки ref

using System;
namespace ConsoleApplication1
{ class Class1
{ static

void P( int a, ref int b )
{
a = 44; b = 33;
Console.WriteLine( "внутри метода {0} {1}", a, b );
}
static void Main()
{
int a = 2, b = 4;
Console.WriteLine( "до вызова {0} {1}", a, b );
P( a, ref b );
Console.WriteLine( "после вызова {0} {1}", a, b );
}}}

©Павловская Т.А. (СПбГУ ИТМО)

Результат работы программы:
до вызова 2 4
внутри метода 44 33
после вызова 2 33

Внимание! Для ссылочных типов данных не надо использовать ref

Слайд 23

Что будет выведено в консоль? Пример: параметры-значения и ссылки ref

Что будет выведено в консоль?

Пример: параметры-значения и ссылки ref

Слайд 24

Что будет выведено в консоль? Пример: параметры-значения и ссылки ref

Что будет выведено в консоль?

Пример: параметры-значения и ссылки ref

Слайд 25

Пример: выходные параметры out результат возвращается не через оператор return, а

Пример: выходные параметры out

результат возвращается не через оператор return, а через

выходной параметр a

Методы, использующие выходные параметры out, обязательно должны присваивать им определенное значение.

Слайд 26

Можно вернуть из метода не одно значение, а несколько. Пример: выходные

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

Пример: выходные параметры

out

Ключевое слово out применяется для передачи аргументов по ссылке

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

Слайд 27

Пример: выходные параметры out using System; namespace ConsoleApplication1 { class Class1

Пример: выходные параметры out

using System;
namespace ConsoleApplication1
{ class Class1
{ static void

P( int x, out int y )
{
x = 44; y = 33;
Console.WriteLine( "внутри метода {0} {1}", x, y );
}
static void Main()
{
int a = 2, b; // инициализация b не требуется
P( a, out b );
Console.WriteLine( "после вызова {0} {1}", a, b );
}}}

©Павловская Т.А. (СПбГУ ИТМО)

Результат работы программы:
внутри метода 44 33
после вызова 2 33

Слайд 28

Пример: передача массива значение i осталось неизменным Измененные значения в myArr

Пример: передача массива

значение i осталось неизменным

Измененные значения в myArr также изменились

в исходном массиве arr1, так как массивы являются ссылочными типами
Слайд 29

Использование ключевого слова params Используя ключевое слово params, можно передавать неопределенное

Использование ключевого слова params

Используя ключевое слово params, можно передавать неопределенное (переменное)

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

Передача отдельных значений

Передача массива значений

Вызов метода без параметров

При объявлении метода ключевое слово params можно использовать только один раз

Слайд 30

using System; public class Program { static void Addition(params int[] integers)

using System;
public class Program
{
static void Addition(params int[] integers)
{
int result =

0;
for (int i = 0; i < integers.Length; i++)
{
result += integers[i];
}
Console.WriteLine(result);
}
public static void Main()
{
Addition(1, 2, 3, 4, 5);
int[] array = new int[] { 1, 2, 3, 4 };
Addition(array);
Addition();
}
}

©Павловская Т.А. (СПбГУ ИТМО)

Слайд 31

Использование ключевого слова params Использование ключевого слова params указывает на то,

Использование ключевого слова params

Использование ключевого слова params указывает на то,

что параметр, передаваемый методу, состоит из одного или более значений. Все эти значения имеют один и тот же тип.
При объявлении метода ключевое слово params можно использовать только один раз
Если же надо передать какие- то другие параметры, то они должны указываться до параметра с ключевым словом params

// Вызов метода

Слайд 32

Использование ключевого слова params

Использование ключевого слова params

Слайд 33

using System; public class MyClass { public static void UseParams(params int[]

using System;
public class MyClass
{
public static void UseParams(params

int[] list)
{
for (int i = 0; i < list.Length; i++)
{
Console.Write(list[i] + " ");
}
Console.WriteLine();
}
public static void UseParams2(params object[] list)
{
for (int i = 0; i < list.Length; i++)
{
Console.Write(list[i] + " ");
}
Console.WriteLine();
}
public static void Main()
{
// Можно отправить разделенный запятыми список
//аргументов указанного типа.
UseParams(1, 2, 3, 4);
UseParams2(1, 'a', "test");
// Следующая инструкция вызова отображает
//только пустую строку.
UseParams2();
// Аргумент массива может быть передан, если
//тип массива соответствует типу параметра вызываемого метода.
int[] myIntArray = { 5, 6, 7, 8, 9 };
UseParams(myIntArray);
object[] myObjArray = { 2, 'b', "test", "again" };
UseParams2(myObjArray);
// Следующий вызов вызывает ошибку компилятора,
//так как object массив не может быть преобразован в массив integer.
//UseParams(myObjArray);
}
}
Слайд 34

Правила применения параметров Для параметров-значений используется передача по значению. Этот способ

Правила применения параметров

Для параметров-значений используется передача по значению. Этот способ применяется

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

Параметры-ссылки и выходные параметры передаются по адресу. Этот способ применяется для

Параметры-ссылки и выходные параметры передаются по адресу. Этот способ применяется для

передачи побочных результатов метода.
При вызове метода на месте параметра-ссылки ref может находиться только имя инициализированной переменной точно того же типа. Перед именем параметра указывается ключевое слово ref.
При вызове метода на месте выходного параметра out может находиться только имя переменной точно того же типа. Ее инициализация не требуется. Перед именем параметра указывается ключевое слово out.

Правила применения параметров

Слайд 36

РЕКУРСИВНЫЕ МЕТОДЫ

РЕКУРСИВНЫЕ МЕТОДЫ

Слайд 37

Определение Рекурсивным называют метод, если он вызывает сам себя в качестве

Определение

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

примером рекурсивного метода является метод, вычисляющий факториал.
Слайд 38

Вызов рекурсивного метода Рассмотрим работу рекурсивного метода, вычисляющего факториал, для n=3.

Вызов рекурсивного метода

Рассмотрим работу рекурсивного метода, вычисляющего
факториал,  для n=3.

Первый вызов метода осуществляется из метода Main

командой f=F(3). Этап вхождения в рекурсию обозначим жирными стрелками. Он продолжается до тех пор, пока значение переменной n не становится равной 1. После этого начинается выход из рекурсии (тонкие стрелки). В результате вычислений получается, что F(3)=3*2*1.

long f=F(n);

Слайд 39

Прямая рекурсия Рассмотренный вид рекурсии называют прямой. Метод с прямой рекурсией

Прямая рекурсия

Рассмотренный вид рекурсии называют прямой.
Метод с прямой рекурсией обычно

содержит следующую структуру:
if (<условие>)
<оператор>;
else <вызов данного метода с другими параметрами>;
В качестве <условия> обычно записываются некоторые граничные случаи параметров, передаваемых рекурсивному методу, при которых результат его работы заранее известен, поэтому далее следует простой оператор или блок, а в ветви else происходит рекурсивный вызов данного метода с другими параметрами.
Слайд 40

Косвенная рекурсия В косвенной рекурсии метод вызывает себя в качестве вспомогательного

Косвенная рекурсия

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

через другой вспомогательный метод.
Метод P будет методом косвенной рекурсии, если в теле P вызывается метод Q (эта цепочка может быть продолжена), в теле которого вызывается метод P.
Косвенную рекурсию демонстрирует следующая программа которая для заданного значения n выводит на экран следующее за ним простое число. 
Слайд 41

Пример косвенной рекурсии метод Prim возвращает true, если его параметр является

Пример косвенной рекурсии

метод Prim возвращает true, если его параметр является простым числом, false – в противном случае

метод NextPrim возвращает

следующее за значением ее параметра простое число
метод NextPrim обращается к методу Prim для того, чтобы определить является ли заданное число простым.