2.44M
Категория: ПрограммированиеПрограммирование

Методы в С#. Основные понятия

1.

14. Методы в С#
Основные понятия

2.

Пример. Вывести на экран следующий текст:
Привет Андрей! Привет Мария! Привет Семен!
Привет Ярослав!
static void Main(string[] args)
{
Console.WriteLine("Привет Андрей!");
Console.WriteLine("Привет Мария!");
Console.WriteLine("Привет Семен!");
Console.WriteLine("Привет Ярослав!");
}

3.

Подпрограммы
• Во всех языках программирования есть
возможность оформлять часть
программного кода в виде подпрограмм.
• Подпрограмма – это относительно
самостоятельный фрагмент программы
(блок), оформленный особым образом и
имеющий имя.
• Упоминание этого имени в программе
называется вызовом подпрограммы.

4.

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

5.

Метод – это подпрограмма, фрагмент кода, написанного
один раз, но который может использоваться многократно
В языке С# нет специальных ключевых слов –
procedure и function, но присутствуют сами
эти понятия. Синтаксис объявления метода
позволяет однозначно определить, чем
является метод – процедурой или функцией.
Синтаксис описания метода:
[модификаторы] тип имя ([параметры])
{ тело метода }
Модификаторы и параметры необязательны.

6.

Модификаторы доступа

7.

Если модификатор доступа опущен, то по
умолчанию предполагается, что он имеет
значение private и метод является
закрытым для клиентов и потомков
класса.
Обязательным при описании заголовка
является указание типа результата,
имени метода и круглых скобок, наличие
которых необходимо и в том случае,
если сам список формальных аргументов
отсутствует.
Тело метода заключается в фигурные
скобки.

8.

Примеры описания методов
void A()
{
// тело метода
};
int B()
{
// тело метода
};
public void C()
{
// тело метода
};
Методы A и B являются закрытыми, а метод С открыт. Методы A и С реализованы процедурами, а
метод B - функцией, возвращающей целое значение.
Примечание: Всегда старайтесь делать код
как можно более кратким – чем короче
программа, тем умнее программист.

9.

Тип результата метода
Формально тип результата метода указывается
всегда, значение void однозначно
определяет, что метод реализуется
процедурой. Тип результата, отличный от
void, указывает на функцию. В теле функции
обязательно указывается оператор return
(возврат), который присваивает функции
нужное значение. Если метод представляет
собой процедуру, то в нем нельзя указывать
оператор return.

10.

Ключевое слово static
Методы могут быть объявлены как статические
– с использованием ключевого слова static
Это значит, что статический метод может быть
вызван напрямую через уровень класса, без
необходимости создавать хотя бы один
экземпляр объекта данного класса.
По этой причине метод Main() всегда
объявляется как static – чтобы этот метод мог
начать выполняться еще до создания первого
экземпляра класса, в котором он определен.

11.

Вызов метода
Чтобы использовать методы в программе, надо
вызвать их в методе Main. Для вызова метода
указывается его имя, после которого в скобках идут
значения для его параметров (если метод принимает
параметры).
название_метода (значения_параметров_метода);
static void hello()
{
Console.WriteLine("hello");
}
static void Main(string[] args)
{
hello();
Console.ReadLine();
}

12.

Пример. Вывести на экран следующий текст:
Привет Андрей!
Привет
Мария!
Привет
Семен!
Привет
Ярослав!
Реализация метода с помощью процедуры
static void SayHello(string someName)
{
Console.WriteLine("Привет " + someName + "!");
}
static void Main(string[] args)
{
SayHello("Андрей"); // вызов метода
SayHello("Мария"); // вызов метода
SayHello("Семен"); // вызов метода
SayHello("Ярослав"); // вызов метода
}

13.

Пример. Вывести на экран следующий текст:
Привет Андрей!
Привет
Мария!
Привет
Семен!
Привет
Ярослав!
Реализация метода с помощью функции
static string Privet(string someName)
{
return "Привет " + someName + "!";
}
static void Main(string[] args)
{
Console.WriteLine(Privet("Андрей"));
Console.WriteLine(Privet("Мария"));
Console.WriteLine(Privet("Семен"));
Console.WriteLine(Privet("Ярослав"));
}

14.

Выход из метода
static string Privet(string someName)
Инструкция,
{
которая никогда
не выполнится
return "Привет " + someName + "!";
Console.WriteLine("ПРИВЕТ, ПРИВЕТ!");
}
static void Main(string[] args)
{
Console.WriteLine(Privet("Андрей"));
}

15.

15. Параметры в методах

16.

Параметры метода
Параметры позволяют передать в метод некоторые
входные данные. Например, имена Андрей, Мария,
Семен, Ярослав в приведенных выше примерах (в
метод передается один параметр типа string).
Значения, которые передаются параметрам, еще
называются аргументами. Иногда можно встретить
такие определения как формальные
параметры и фактические параметры. Формальные
параметры – это собственно параметры метода (в
данном случае someName), а фактические параметры –
значения, которые передаются формальным
параметрам. То есть фактические параметры – это и
есть аргументы метода.

17.

Пример. Напишем метод max2(), который
принимает два числа и возвращает
максимальное из них
static int max2(int a, int b)
{
if (a > b) return a;
else return b;
}
static void Main(string[] args)
{
Console.WriteLine(max2(4,3));
Console.WriteLine(max2(7, -1));
Console.WriteLine(max2(int.Parse(Console.ReadLine()),
int.Parse(Console.ReadLine())));
}

18.

Теперь можно написать метод max3(), который
принимает три числа и возвращает
При передаче значений
максимальное их них.
static int max2(int a, int b) параметрам важно
учитывать тип
{
параметров: между
if (a > b) return a;
аргументами и
else return b;
параметрами должно
}
быть соответствие по типу
static int max3(int a, int b, int c)
{
return max2(max2(a, b), c);
}
static void Main(string[] args)
{
Console.WriteLine(max3(-3,4,3));
}

19.

Необязательные параметры
По умолчанию при вызове метода необходимо
предоставить значения для всех его параметров. Но C#
также позволяет использовать необязательные параметры.
Для таких параметров необходимо объявить значение по
умолчанию. Также следует учитывать, что после
необязательных параметров все последующие параметры
также должны быть необязательными:
static int sum(int x, int y, int z=5, int s=4)
{
return x + y + z + s;
}
Так как последние два параметра объявлены как
необязательные, то мы можем один из них или оба
опустить:
sum(2, 3); //14
sum(2,3,10); //19

20.

Именованные параметры
В предыдущих примерах при вызове методов
значения для параметров передавались в
порядке объявления этих параметров в методе.
Но мы можем нарушить подобный порядок,
используя именованные параметры:
sum(x:2, y:3);
sum(y:2,x:3,s:10);
//Необязательный параметр z использует
значение по умолчанию

21.

Передача параметров по значению
и ссылке
Передача параметров по значению
Наиболее простой способ передачи параметров
представляет передача по значению, по сути это
обычный способ передачи параметров:
static void Main(string[] args)
{
Console.WriteLine(sum(2.3,3.5));//5,8
Console.ReadKey();
}
static double sum(double a, double b)
{
return a + b;
}

22.

Передача параметров по значению
и ссылке
Передача параметров по ссылке и
модификатор ref
static void Main(string[] args)
{
double x = 2.3, y = 3.5;
sum(ref x, y);
Console.WriteLine("x={0}, y={1}",x,y);
Console.ReadKey();
}
static void sum(ref double a, double b)
{
a+= b;
}

23.

Сравнение передачи по значению и по ссылке
В чем отличие двух способов передачи
параметров? При передаче по значению
метод получает не саму переменную, а
ее копию. А при передаче параметра по
ссылке метод получает адрес переменной
в памяти. И, таким образом, если в
методе изменяется значение параметра,
передаваемого по ссылке, то также
изменяется и значение переменной,
которая передается на его место.

24.

Пример. Передача параметров по значению
static void Main(string[] args)
{
int a = 5;
Console.WriteLine("Начальное значение
переменной a = " + a);
IncrementVal(a);
Console.WriteLine("Переменная a после
передачи по значению равна = " + a);
}
static void IncrementVal(int x)
{
x++;
Console.WriteLine("IncrementVal: " + x);
}

25.

Пример. Передача параметров по ссылке
static void Main(string[] args)
{
int a = 5;
Console.WriteLine("Начальное значение
переменной a = " + a);
IncrementRef(ref a);
Console.WriteLine("Переменная a после
передачи ссылке равна = " + a);
}
static void IncrementRef(ref int x)
{
x++;
Console.WriteLine("IncrementRef: " + x);
}

26.

Выходные параметры
Модификатор out
Результат
возвращается не
static void Main(string[] args) через оператор return,
а через выходной
{
double x = 2.3, y = 3.5, s; параметр.
Преимущество в том,
sum(x,y,out s);
что из метода можно
Console.WriteLine("s="+s);
вернуть больше
Console.ReadKey();
одного значения
}
static void sum(double a, double b, out double sum)
{
sum = a+ b;
}

27.

Входные параметры
Модификатор in
Модификатор in указывает, что данный параметр будет
передаваться в метод по ссылке, однако внутри метода
его значение параметра нельзя будет изменить.
static void Main(string[] args)
{
int x = 2, y = 3, s;
sum(in x, y, out s);
Console.WriteLine("s="+s);
Console.ReadKey();
}
static void sum(in int a, int b, out int sum)
{
sum = a + b;
}

28.

Локальные и глобальные переменные
А – основная
программа
B, C, D, E –
подпрограммы.
Переменные,
описанные в А,
являются
глобальными по
отношению ко всем
подпрограммам.
Переменные, описанные в С, являются
глобальными по отношению к D и т.д.

29.

Область видимости
Каждая переменная доступна в рамках определенного
контекста или области видимости. Вне этого
контекста переменная уже не существует.
Существуют различные контексты:
Контекст класса. Переменные, определенные на
уровне класса, доступны в любом методе этого класса
Контекст метода. Переменные, определенные на
уровне метода, являются локальными и доступны
только в рамках данного метода. В других методах
они недоступны
Контекст блока кода. Переменные, определенные на
уровне блока кода, также являются локальными и
доступны только в рамках данного блока. Вне своего
блока кода они не доступны.

30.

class Program // начало контекста класса
Пример
{
static int a = 9; // переменная уровня класса
static void Main(string[] args) // начало контекста
метода Main
{
int b = a - 1; // переменная уровня метода
{ // начало контекста блока кода
int c = b - 1; // переменная уровня блока
кода
} // конец контекста блока кода, переменная с
уничтожается
} // конец контекста метода Main, переменная b
уничтожается
} // конец контекста класса, переменная a
уничтожается

31.

Работа с консольным окном
Для работы с консольным окном используется
класс Console. Класс Console обладает свойствами,
которые позволяют управлять консолью.
Некоторые из них:
BackgroundColor − цвет фона консоли;
ForegroundColor − цвет шрифта консоли;
Title − заголовок консоли.

32.

Работа с консольным окном
Для взаимодействия с консолью можно также
использовать методы:
Clear − очистка консоли;
ResetColor − Устанавливает для цветов фона и
текста консоли их значения по умолчанию;
SetCursorPosition − Устанавливает положение
курсора;
SetWindowSize − Устанавливает заданные
значения высоты и ширины окна консоли;

33.

Работа с консольным окном
Задать цвет можно с помощью конструкции
(перечисления) ConsoleColor.
где цвет может быть выбран из таблицы
Black
Blue
Cyan
Red
Yellow
Gray
Green
White
Черный
Синий
Бирюзовый
Красный
Желтый
Серый
Зеленый
Белый

34.

Пример 1. Составить программу, выводящую на экран четыре
горизонтальные линии символов «*»:
1 линия: 7 символов, 2 линия: 19 символов, 3 и 4 линии:
любое количество символов (< 80, вводить с клавиатуры)
В результате работы программы на экране должны
появиться следующие линии:
*******// всего 7
*******************// всего 19
***…***// всего k
***…***// всего m
В этой задаче 4 раза повторяются одинаковые
действия, а именно, вывод строки из «*», но
количество «*» в каждом случае различно. Вывод n
звездочек на экран можно организовать в цикле с
параметром, повторяющимся n раз, и в теле цикла на
экран будет выводиться одна звездочка при помощи
метода Write(“*”).

35.

static void zvezd(int n)
{
for (int i = 0; i < n; i++)
Console.Write("*");
Console.WriteLine();
}
static void Main(string[] args)
{
Console.SetWindowSize(60, 20);
Console.BackgroundColor = ConsoleColor. Yellow;
Console.ForegroundColor = ConsoleColor. Blue;
Console.Clear();
Console.WriteLine("Введите значение k (от 0 до 80):");
byte k = Convert.ToByte(Console.ReadLine());
Console.WriteLine("Введите значение m (от 0 до 80):");
byte m = Convert.ToByte(Console.ReadLine());
zvezd(7); // первый вызов метода
zvezd(19); // второй вызов метода
zvezd(k); // третий вызов метода
zvezd(m); // четвертый вызов метода
}

36.

Пример 2. Составить программу рисования изображения
//горизонтальная линия
static void line1(int x, int y, int n)
{
Console.SetCursorPosition(x, y);
for (int i = 0; i < n; i++)
Console.Write("*");
}
//вертикальная линия
static void line2(int x, int y, int n)
{
for (int i = 0; i < n; i++)
{
Console.SetCursorPosition(x, y+i);
Console.Write("*");
}
}

37.

static void Main(string[] args)
{
Console.SetWindowSize(60, 20);
Console.BackgroundColor = ConsoleColor.Cyan;
Console.ForegroundColor = ConsoleColor.Red;
Console.Clear();
line1(18,6,1); line1(17, 7, 3);
line1(13, 8, 11); line1(12, 9, 13);
line1(10, 10, 17); line1(10, 11, 1);
line1(15, 11, 1); line1(21, 11, 1);
line1(27, 11, 1); line2(18, 11, 6);
line1(19, 16, 3); line2(21, 15, 1);
Console.ReadLine();
}

38.

Пример 3. Составить программу вычисления значения
функции
static double f(int x, int y)
{
return (x+Math.Sin(x))/(Math.Sin(y)+y);
}
static void Main(string[] args)
{
double s = f(2, 5)+f(6, 3)+f(1, 4);
Console.WriteLine("s={0:f2}",s);
Console.ReadLine();
}

39.

Пример 4. Написать метод для обмена значений двух
переменных
static void Obmen(ref int x1, ref int y1)
{
int t = x1;
x1 = y1;
y1 = t;
}
static void Main(string[] args)
{
int x = 10, y=5;
Obmen(ref x, ref y);
Console.WriteLine("{0},{1}",x,y);
}

40.

Пример 5. Написать метод для нахождения
минимума из двух переменных
static void Min(ref int x2, ref int y2)
{
if (x2 > y2) Obmen(ref x2, ref y2);
}
static void Main(string[] args)
{
int x = 10, y=5;
Min(ref x, ref y);
Console.WriteLine("{0},{1}",x,y);
}
English     Русский Правила