Как создать метод в c

Как создать метод в c

Как создать метод в c

Доброго времени суток! В этом уроке я расскажу, что же такое методы в C#. Я уже не раз употреблял этот термин, и пришла пора разобраться с ним. Как всегда, я не буду перегружать Вас информацией, дам только самое необходимое (разумеется, на мой взгляд).

И так, что же такое метод? В контексте объектно-ориентированного программирования, метод – это подпрограмма. А подпрограмма, в свою очередь – это фрагмент программы, который написать нужно один раз, а использовать его можно многократно (для выполнения однотипных действий). Это довольно удобно по нескольким причинам, например, можно реализовать определенный алгоритм один раз, хорошо его отладить, и быть уверенным в правильности его работы применяя его в дальнейшем многократно. Да и использование подпрограмм, значительно сокращает объем исходного кода проекта. Или еще представьте такую ситуацию, мы один раз написали подпрограмму, которая выполняет определенные действия, и многократно её используем, а потом, технические требования заставляют нас модифицировать алгоритм этих самых действий, так вот, нам достаточно всего один раз изменить код подпрограммы (изменения применяется во всех местах её использования). Думаю я убедил Вас в том, что познакомиться с методами в C# обязательно стоит!

И так, к делу! Мы уже знакомы с методом «Main» в главном файле программы. Это, так называемая точка входа в программу, главный метод наших программ. Этот метод, Visual Studio сгенерила сама, давайте рассмотрим, как он выглядит в исходном состоянии (сразу после создания нового проекта). Для этого создадим новый проект консольного приложения и рассмотрим код метода «Main», что называется под детально! А выглядит он вот так:

Я преднамеренно привел код метода «Main» вместе с объемлющим его кодом. Метод «Main» относится к классу «Program» (т.е. находится внутри класса «Program«).

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

Метод состоит из так называемого заголовка и тела:

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

Далее идет ключевое слово void, в этом месте, указывается тип возвращаемого методом значения. Что это значит? Это значит, что выполнив какую-то работу, метод может вернуть её результат, а мы можем сохранить его в какой-либо переменной (и использовать для дальнейших нужд). А тип переменной, должен совпадать с типом возвращаемого значения! Но не каждый метод должен возвращать какое-то значение, и именно в тех случаях, когда метод «ничего не возвращает» указывается ключевое слово void.

Если бы метод «Main» должен был возвращать целое число, то вместо слова void было бы использовано слово int.

После ключевого слова void следует название метода, в данном случае – это Main. После названия идут круглые скобки, в которых определяются аргументы метода. В нашем случае – это «string[] args». Т.е. массив строк. Аргументы метода – это входные данные, которые получает метод. Аргументы метода в заголовке еще называют его формальными параметрами.

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

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

Думаю что с заголовками методов более или менее понятно, давайте рассмотрим, что такое тело метода. А это просто набор операторов, заключенный в фигурные скобки сразу после заголовка метода.

Метод, чей заголовок мы рассматривали ранее, целиком, может выглядеть примерно так:

Т.е. по факту, мы уже имеем написанный метод (подпрограмму), но теперь нужно им как-то воспользоваться, иначе, зачем он нам нужен? А чтобы воспользоваться методом, нужно его, так сказать, вызвать! Делается это следующим образом:

В примере выше мы вызвали метод «Sum» с фактическими параметрами, где первый из них равен 24 а второй – 6. Результат метода будет сохранен в переменной «result» и позже мы выводим его в консоль. В принципе, все просто!

А теперь, давайте применим полученные знания на практике! Улучшим пример из предыдущего урока. В нем мы дважды просили пользователя ввести целое число с клавиатуры, т.е. выполняли однотипные действия. Давайте оптимизируем наш код, создадим метод, который будет принимать в качестве аргумента текст приглашения пользователю, а возвращать введенное им число, после чего дважды вызовем этот метод с разными формальными параметрами.

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

Методы в C#

Методы в C#, как и практически в любом другом языке программирования — это именованные участки кода, в котором выполняется ряд операций. С методами мы так или иначе сталкивались при изучении возможностей C# с самого начала. Пишем мы первую программу, выводящую на экран строку «Hello world» или изучаем циклы и способы сортировки массивов — мы вызываем в нашей программе хотя бы один метод. И сегодня мы попробуем более детально изучить методы в C#, а также научимся их вызывать.

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

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

обязательными элементами для определения метода в C# являются: тип возвращаемого значения и имя метода. Самый первый пример метода, который мы могли видеть в C# — это метод Main() , который является и точкой входа для нашего консольного приложения. Рассмотрим описание этого метода:

static — это модификатор. О том, что он обозначает, мы поговорим позднее, когда доберемся до работы с классами и объектами в C#.

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

Main — это имя метода.

string[] args — это единственный параметр метода — массив строк.

В фигурных скобках Visual Studio создала нам тело метода, состоящее по умолчанию всего из одной строки — вывод в консоль «Hello world».

Попробуем написать свой первый собственный метод C#. Можно было бы ограничиться стандартными примерами первых методов, типа расчёта площади круга или сложения двух чисел, но мы сделаем по-другому — мы немного улучшим программу сортировки массива, которую написали в прошлый раз.

Учимся определять собственные методы в C#

Посмотрим на исходный код нашей программы:

здесь у нас в методе Main() чего только не напихано — и вывод массива на экран и сортировка выбором. Обычно, участок кода выделяется в отдельный метод, если он (код) повторяется в программе многократно или необходимо выделить решение какой-либо задачи. В нашем же случае в программе можно выделить два отдельных метода:

  1. Метод вывода массива на экран (этот код у нас повторяется дважды — перед сортировкой и после сортировки)
  2. Метод, который будет сортировать массив.

Начнем с метода вывода массива на экран. Название метода должно максимально отражать его суть — пусть название метода будет PrintArray . Далее, что будет возвращать наш метод? В данном случае, ничего возвращать не требуется, поэтому будем использовать void . И, наконец, параметры. Задача метода — вывести на экран массив. Чтобы можно было в дальнейшем многократно использовать наш метод, в качестве параметра метод должен принимать какой-либо массив. Итого, получается вот такое описание метода:

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

Здесь мы в цикле foreach перебираем массив, переданный нам в качестве параметра и выводим значения на экран в виде строки.

Второй метод — это метод сортировки массива. Опять же, имя — так как у нас используется сортировка выбором, то пусть метод будет называться SelectSort . Возвращаемое значение также оставляем пустым ( void ), так как перед нами не стоит задачи хранить оба варианта массива (сортированный и несортированный). В качестве параметра будет выступать, опять же массив целых чисел. Весь метод должен выглядеть вот так:

Теперь у нас есть два метода и, если вы все сделали как показано выше, то Visual Studio напишет имена методов серым цветом и предложит удалить неиспользуемые члены класса Program . Выглядит это примерно так:

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

Вызов методов C#

Чтобы вызвать метод C# необходимо написать его имя и, при необходимости, в круглых скобках передать методу необходимые параметры. Методы мы будем вызывать внутри метода Main() вот так:

Теперь можно запустить программу и убедиться, что всё работает ровно так, как и в прошлый раз, НО при этом можно назвать следующие преимущества использования методов в C#:

  1. Методы можно многократно использовать в программе (например, PrintArray мы вызвали дважды)
  2. Выделение частей кода в отдельные методы позволяет сделать код более понятным (согласитесь, что изучить код метода на 10-50 строк намного проще, чем изучать «портянку» на 100500 строк)
  3. Использование методов позволяет значительно упростить дальнейшее сопровождение всего проекта. Например, если мы заходим, чтобы значения массива выводились не через пробел, а через запятую, то нам будет достаточно переписать всего один метод, а не искать по всему коду где массив выводится на экран. На небольших проектах это преимущество не совсем очевидно, но, когда вы имеете дело с проектом на десятки и сотни тысяч строк кода, то использование методов становится уже жизненно необходимым (представьте себе программу, хотя бы на 1000 строк кода всего с одним методом…жуть).

Возвращаемые методами C# значения

До сих пор мы имели дело с методами, которые не возвращают значений (с void в качестве возвращаемого значения). Что делать если метод должен вернуть какое-либо значение, например, если мы хотим узнать сколько замен провел наш метод SelectSort, чтобы отсортировать массив по возрастанию? Для этого наш метод должен:

  1. в качестве возвращаемого значения уже иметь не void , а число int (количество перестановок у нас измеряется целыми числами — не может быть 1,5 перестановки)
  2. использовать в теле метода оператор return .

Оператор return завершает выполнение текущего метода и возвращает значение из этого метода. Вызов оператора return выглядит следующим образом:

expression — это значение, которое должен вернуть метод. Если оператор в коде выглядит вот так:

то метод не вернет ничего, но при этом завершит свою работу. Давайте перепишем наш метод SelectSort , чтобы получать не только отсортированный массив, но и количество перестановок, которые были сделаны.

Теперь наша программа сортировки массива станет ещё более информативной. Метод SelectSort можно вызвать вот так:

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

9 8 7 6 5 4 3 2 1 0

Количество перестановок в массива: 5

0 1 2 3 4 5 6 7 8 9

Методы C#, возвращающие несколько значений

Что, если наш метод должен вернуть не одно, а сразу несколько значений? Опять же,возвращаясь к нашему методу SelectSort — что делать, если нам необходимо вернуть не только количество замен, но и количество сравнений элементов (количество итераций внутреннего цикла for )? Такая задача может решаться несколькими способами, я же покажу лишь один из них — одно значение (количество перестановок) мы будем передавать в качестве возвращаемого значения, а второе — через параметр метода. Сделать это можно, объявив метод следующим образом:

Обратите внимание на то, что написано в круглых скобках после запятой. Ключевое слово out используется для передачи аргументов (параметров) по ссылке. Есть также аналогичное ключевое слово ref , но ref требует, чтобы перед передачей в метод переменная должна была инициализирована, out же этого не требует. Теперь наш метод принимает два параметра один из которых обязательно должен быть переменной. То есть, мы можем вызвать наш метод вот так:

оба параметра — переменные . А можем вот так:

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

Здесь я попытался передать не переменную, а значение и компилятор C# выдал ошибку:

Надеюсь, понятно. Теперь вернемся к нашему методу и перепишем его следующим образом:

Теперь наш метод C# возвращает уже не одно, а два значения: количество перестановок и количество сравнений, а нашу программу можно переписать следующим образом:

Вывод консоли станет ещё более информативным:

9 1 5 6 8 90 -10 13 44 11 54

Количество перестановок в массива: 4. Сравнений 66

-10 1 5 6 8 9 11 13 44 54 90

Как видите, обеспечить возврат нескольких значений одним методом — это не такая уж и проблема. Как я сказал, эту же задачу можно решить несколькими способами, но об этих способах нам пока знать рановато — рассмотрим позднее.

Выход из метода

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

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

Итого

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

Урок 5. Методы и функции в C#

Модификатор доступа — откуда этот метод может быть вызван. Некоторые из них:

Пример функции (метода):

public Boolean StartService(string serviceName) < // код функции >

В примере:
public модификатор доступа,
Boolean тип возвращаемого значения,
StartService идентификатор (имя),
string serviceName параметр (аргумент).

static void SayHello()

Вызов метода / функции

static void Main(string[] args) < int res; Square(5, out res); Console.WriteLine(res); >static void Square(int a, out int res)

В этом примере:
a — ref аргумент (входно-выходной);
res — out аргумент (выходной).

Возврат значения из функции / метода

Три подхода для возврата значений в си шарп:

// 1. без ref static void Main(string[] args) < int a = 1; Plas2(a); Console.WriteLine(a); // результат 1 >static void Plas2(int a)

// 2. с ref static void Main(string[] args) < int a = 1; Plas2(ref a); Console.WriteLine(a); // результат 3 >static void Plas2(ref int a)

Перегрузка методов / функций

Задания и лабораторные си шарп

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

Указание: Необходимо использовать ключевое слово static в сигнатуре метода, потому что основная функция статична, и мы не можем вызвать нестатический метод из статического метода.

Пример выполнения:

[Название проекта: Lesson_5Lab1 , название файла L5Lab1.cs ]

  • Запустите Visual Studio.
  • Создайте консольное приложение, назовите проект Lesson_5Lab1 .
  • В окне Solution Explorer (Обозреватель решений) найдите файл Program.cs и переименуйте его в L5Lab1.cs .
  • В главной функции запросите пользователя ввести два числа:

static void Main(string[] args)

Перегрузка метода / функции:

Выполнить: Вводятся три числа — длины трех сторон треугольника. Создайте функцию Perimeter( ), которая вычисляет периметр треугольника по длинам трех его сторон.

Указание 1: Метод Perimeter() должен принимать в качестве аргументов три целых числа.
Указание 2: Метод не должен возвращать никакого значения, поэтому вы должны использовать ключевое слово void в сигнатуре:

static void Perimeter(. );

Указание 3: Не забудьте преобразовать введенные значения в целые числа. Например:

int a = int.Parse(Console.ReadLine());

Пример выполнения:

[Название проекта: Lesson_5Task1 , название файла L5Task1.cs ]

Выполнить: Необходимо переделать предыдущую задачу, теперь функция периметр должна возвращать целое значение. Напомним задание: Вводятся три числа — длины трех сторон треугольника. Создайте функцию Perimeter( ), которая вычисляет периметр треугольника по длинам трех его сторон.

Указание 1: Метод Perimeter() должен принимать в качестве аргументов три целых числа.
Указание 2: Метод должен возвращать значение типа integer, поэтому вы должны использовать ключевое слово int в сигнатуре:

static int Perimeter(. );

Указание 3: Не забудьте преобразовать введенные значения в целые числа. Например:

int a = int.Parse(Console.ReadLine());

Пример выполнения:

[Название проекта: Lesson_5Task2 , название файла L5Task2.cs ]

Выполнить: Создайте метод GetPow() , который принимает два целочисленных аргумента — число и степень. Метод возвращает результат возведения числа в степень.

Указание 1: Необходимо использовать служебное слово static , потому что основная функция статичная (static), а мы не можем вызвать нестатический метод из статического метода.

Указание 2: Функция возвращает целочисленное значение, поэтому необходимо использовать int в сигнатуре функции:

static int GetPow(int baseNum, int powNum)

Пример выполнения:

[Название проекта: Lesson_5Lab2 , название файла L5Lab2.cs ]

  • Запустите Visual Studio.
  • Создайте консольное приложение, назовите проект Lesson_5Lab2 .
  • После закрывающей скобки функции Main создайте функцию GetPow :

Выполнить: Создайте метод Distance который вычисляет расстояние между двумя точками на плоскости. Координаты точек вводятся (переменные x1 , y1 — для первой точки, и x2 , y2 — для второй).

Указание 1: Метод Distance() принимает 4 аргумента (координаты точек).
Указание 2: Метод не должен возвращать значение, поэтому следует использовать ключевой слово void в сигнатуре:

static void Distance(. );

Указание 3: Для подсчета расстояния между двумя точками на плоскости используйте формулу:

квадратный корень: Math.Sqrt(. ); степень числа: Math.Pow(number, power);

Пример выполнения:

[Название проекта: Lesson_5Task3 , название файла L5Task3.cs ]

Выполнить: Необходимо переделать предыдущее задание. Создайте метод Distance который вычисляет расстояние между двумя точками на плоскости. Координаты точек вводятся (переменные x1 , y1 — для первой точки, и x2 , y2 — для второй).

Указание: Метод должен возвращать вещественное значение (double):

static double Distance(. );

Пример выполнения:

[Название проекта: Lesson_5Task4 , название файла L5Task4.cs ]

Выполнить: Создайте метод Minmax() который принимает два целочисленных аргумента по ссылке (ref) и меняет их значения таким образом, что первый становится максимальным, а второй — минимальным (меняет значения аргументов, если требуется). Создайте перегруженный метод Minmax для трех параметров.

Указание 1: Необходимо использовать ключевое слово static в сигнатуре создаваемого метода, т.к. функция Main тоже static, невозможно вызвать не static метод из static метода.

Указание 2: Метод не возвращает значения значит, используется ключевое слово void в сигнатуре).

Пример выполнения:

[Название проекта: Lesson_5Lab3 , название файла L5Lab3.cs ]

  • Создайте консольное приложение, назовите проект Lesson_5Lab3 .
  • В окне Solution Explorer (Обозреватель решений) найдите файл Program.cs и переименуйте его в L5Lab3.cs .
  • В теле функции Main попросите пользователя ввести два числа. Присвойте введенные значения переменным:

Перегруженный метод (функция):

Выполнить: Вводится двузначное целое число. Создайте метод ChangeDigits() , который принимает введенный аргумент по ссылке и изменяет его значение так, чтобы первая цифра нового числа была второй цифрой введенного числа и, наоборот, вторая цифра нового числа была первой цифрой введенного числа. Например, если ввести 45, то результирующее число будет равно 54.

Указание 1: Метод ChangeDigits() принимает аргумент с модификатором ref.
Указание 2: Метод не возвращает значения:

static void ChangeDigits(. );

Указание 3: Сначала необходимо получить цифры из числа. Затем, поменяв местами цифры, сделать новое число. Пример создания нового числа из двух цифр:

Пример выполнения:

[Название проекта: Lesson_5Task5 , название файла L5Task5.cs ]

Выполнить: Вводятся два двузначных целых числа. Создайте функцию BitwiseSum() , которая вычисляет их побитовую сумму по модулю 10. Например, побитовая сумма чисел 34 и 59 является числом 83 (3 + 5 = 8; 4 + 9 = 13, 13%10 = 3).

Указание 1: Функция BitwiseSum() имеет два аргумента.
Указание 2:Функция возвращает целочисленное значение int :

static int BitwiseSum(. );

[Название проекта: Lesson_5Task6 , название файла L5Task6.cs ]

Выполнить: Создайте функцию MinmaxSeq() , которая принимает два аргумента по ссылке (ref аргументы) — минимальное и максимальное значение вводимой последовательности чисел. Запросите у пользователя ввести последовательность, которая должна закончиться 0 (если вводится 0, то ввод завершается). Функция должна выполнять поиск максимального и минимального значения последовательности и возвращать результат.

Указание 1: Функция не должна возвращать значениен (поэтому в объявлении функции используется void ). Параметры ref — это параметры ввода-вывода, это говорит о том, что значения этих параметров меняются внутри функции и возвращаются в основную программу с вызовом фнукции.
Указание 2: Необходимо использовать ключевое слово static в объявлении метиода, так как функция Main тоже статическая, а нестатическая фнукция не может быть вызвана внутри статической.

[Название проекта: Lesson_5Lab4 , название файла L5Lab4.cs ]

Пример вывода:

  • Создайте Консольное приложение и назовите его Lesson_5Lab4 .
  • В окне Обозреватель решений найдите файл Program.cs и переименуйте его в L5Lab4.cs .
  • В функции Main объявите две переменные для хранения минимального и максимального значения последовательности. Присвойте им начальные значения: для переменной min — наибольшее возможное целое число, для переменной max — наименьшее возможное целое число:

Выполнить: Создайте функцию PosNegSeq() , которая принимает два аргумента по ссылке — счетчики положительных чисел последовательности и отрицательных чисел. Пользователь вводит последовательность целых чисел, завершая ввод 0 . Функция должна посчитать количество отрицательных и положительных чисел и вернуть значения счетчиков в главную программу.

Указание 1: Функция не должна возвращать значение (поэтому используется ключевое слово void в объявлении функции). Параметр ref — это параметр ввода-вывода, что означает, что значения параметров будут изменены внутри функции и возвращены в основную программу.
Указание 2: Параметры ref должны быть инициализированы до вызова функции. Поэтому сначала вам необхзодимо инициализировать такие параметры значениями. Установите начальные значения для этих параметров, равные 0 :

. int counterPositive = 0; int counterNegative = 0; .

[Название проекта: Lesson_5Task7 , название файла L5Task7.cs ]

Пример вывода:

static void Main(string[] args) < int[] a = new int[] < -1, -2, 3, 4, 5, 6, 7 >; WriteLine(«Начальный массив: «); Print(a); int countPos = 0; int countOdd = 0; CountOddPositive(a, ref countPos, ref countOdd); WriteLine($»number of odd elements: , number of positive elements .»); > static void Print(int[] arr) < WriteLine("array:"); foreach (var x in arr) Write(x + " "); WriteLine(); >static void CountOddPositive( int[] arr, ref int countOdd, ref int countPos) < foreach (var x in arr) < if (x % 2 != 0) countOdd++; if (x >0) countPos++; > //return (Odd, Pos); > —>

Ссылка на основную публикацию