Uploaded by alla_kri

Процедуры и функции – методы класса

advertisement
Процедуры и функции –
методы класса.
Преподаватель Кривошеина А.В.
ЧУО «Колледж бизнеса и права»
Определение метода
 Метод — функциональный элемент класса,
реализующий вычисления или другие действия.
Методы определяют поведение класса и составляют
его интерфейс.
 Метод – это конструкция в виде блока кода, которая
выполняет некоторые действия, и имеет логическую
смысловую нагрузку. Аналогом методов языка 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.
Download