Как создать метод в c
Перейти к содержимому

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

  • автор:

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

Если переменные хранят некоторые значения, то методы содержат собой набор инструкций, которые выполняют определенные действия. По сути метод — это именованный блок кода, который выполняет некоторые действия.

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

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

Модификаторы и параметры необязательны.

Ранее мы уже использовали как минимум один метод — Console.WriteLine() , который выводит информацию на консоль. Теперь рассмотрим, как мы можем создавать свои методы.

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

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

void SayHello()

Здесь определен метод SayHello , который выводит некоторое сообщение. К названиям методов предъявляются в принципе те же требования, что и к названиям переменных. Однако, как правило, названия методов начинаются с большой буквы.

Перед названием метода идет возвращаемый тип данных. Здесь это тип void , который указыает, что фактически ничего не возвращает, он просто производит некоторые действия.

После названия метода в скобках идет перечисление параметров. Но в данном случае скобки пустые, что означает, что метод не принимает никаких параметров.

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

Console.WriteLine("Hello");

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

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

Чтобы использовать метод SayHello, нам надо его вызвать. Для вызова метода указывается его имя, после которого в скобках идут значения для его параметров (если метод принимает параметры).

название_метода (значения_для_параметров_метода);

Например, вызов метода SayHello будет выглядеть следующим образом:

SayHello();

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

Объединим определение и вызов метода:

void SayHello() < Console.WriteLine("Hello"); >SayHello(); // Hello SayHello(); // Hello

методы в C# и .NET

Консольный вывод программы:

Hello Hello

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

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

SayHello(); // Hello SayHello(); // Hello void SayHello()

Определим и вызовем еще несколько методов:

void SayHelloRu() < Console.WriteLine("Привет"); >void SayHelloEn() < Console.WriteLine("Hello"); >void SayHelloFr() < Console.WriteLine("Salut"); >string language = «en»; switch (language)

Здесь определены три метода SayHelloRu() , SayHelloEn() и SayHelloFr() , которые также имеют тип void , не принимают никаких параметров и также выводит некоторую строку на консоль. Условно говоря, они выводят приветствие на определенном языке.

В конструкции switch проверяется значение переменной language , которая условно хранит код языка, и в зависимости от ее значения вызывается определенный метод. Так, в данном случае на консоль будет выведено

Hello

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

Если метод в качестве тела определяет только одну инструкцию, то мы можем сократить определение метода. Например, допустим у нас есть метод:

void SayHello()

Мы можем его сократить следующим образом:

void SayHello() => Console.WriteLine("Hello");

То есть после списка параметров ставится оператор => , после которого идет выполняемая инструкция.

Методы

Следует отметить, что официальная терминология C# делает различие между функциями и методами. Согласно этой терминологии, понятие «функция-член» включает не только методы, но также другие члены, не являющиеся данными, класса или структуры. Сюда входят индексаторы, операции, конструкторы, деструкторы, а также — возможно, несколько неожиданно — свойства. Они контрастируют с данными-членами: полями, константами и событиями.

Объявление методов

В C# определение метода состоит из любых модификаторов (таких как спецификация доступности), типа возвращаемого значения, за которым следует имя метода, затем список аргументов в круглых скобках и далее — тело метода в фигурных скобках:

[модификаторы] тип_возврата ИмяМетода([параметры]) < // Тело метода >

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

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

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

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

Давайте рассмотрим пример:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 < class MyMathOperation < public double r; public string s; // Возвращает площадь круга public double sqrCircle() < return Math.PI * r * r; >// Возвращает длину окружности public double longCircle() < return 2 * Math.PI * r; >public void writeResult() < Console.WriteLine("Вычислить площадь или длину? s/l:"); s = Console.ReadLine(); s = s.ToLower(); if (s == "s") < Console.WriteLine("Площадь круга равна ",sqrCircle()); return; > else if (s == "l") < Console.WriteLine("Длина окружности равна ",longCircle()); return; > else < Console.WriteLine("Вы ввели не тот символ"); >> > class Program < static void Main(string[] args) < Console.WriteLine("Введите радиус: "); string radius = Console.ReadLine(); MyMathOperation newOperation = new MyMathOperation < r = double.Parse(radius) >; newOperation.writeResult(); Console.ReadLine(); > > > 

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

Использование параметров

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

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

Давайте рассмотрим пример:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 < class myClass < public void someMethod(double[] myArr, int i ) < myArr[0] = 12.0; i = 12; >> class Program < static void Main(string[] args) < double[] arr1 = < 0, 1.5, 3.9, 5.1 >; int i = 0; Console.WriteLine("Массив arr1 до вызова метода: "); foreach (double d in arr1) Console.Write("\t",d); Console.WriteLine("\nПеременная i = \n",i); Console.WriteLine("Вызов метода someMethod . "); myClass ss = new myClass(); ss.someMethod(arr1,i); Console.WriteLine("Массив arr1 после вызова метода:"); foreach (double d in arr1) Console.Write("\t",d); Console.WriteLine("\nПеременная i = \n",i); Console.ReadLine(); > > >

Передача параметров в методы C#

Обратите внимание, что значение i осталось неизменным, но измененные значения в myArr также изменились в исходном массиве arr1, так как массивы являются ссылочными типами.

Поведение строк также отличается. Дело в том, что строки являются неизменными (изменение значения строки приводит к созданию совершенно новой строки), поэтому строки не демонстрируют поведение, характерное для ссылочных типов. Любые изменения, проведенные в строке внутри метода, не влияют на исходную строку.

C#: Создание (определение) метода

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

// Место откуда берется класс с методом using MailerLib; var email = "support@hexlet.io"; var title = "Помогите"; var body = "Я написал историю успеха, как я могу получить скидку?"; // Mailer – имя класса по аналогии с Console, который мы уже многократно использовали // Один маленький вызов — и много логики внутри Mailer.Send(email, title, body); 

Создадим наш первый метод. Его задача — вывести на экран текущую дату:

Today is: 2021-10-25
// Объявление класса class App < // Определение метода public static void ShowCurrentDate() < // Класс со свойством для получения текущего времени var currentDate = DateTime.Now; var text = $"Today is: "; Console.WriteLine(text); > > // Вызов метода // Обязательно указывать имя класса App.ShowCurrentDate(); // => "Today is: 09.12.2021 10:52:13" 

Определение метода в C# включает в себя много страшных слов, которые мы постепенно разберем.

Объявление класса

class App < // . >

Класс объявляется через ключевое слово class , за которым следует имя создаваемого класса App . Потом идут фигурные скобки <> между которыми идет наполнение этого класса. Проще всего воспринимать класс как «контейнер» для методов. Представьте себе ящик с инструментами (класс) в котором лежат нужные инструменты (методы).

Console.WriteLine("Hello"); // Console – "контейнер" для инструментов работы с консолью // WriteLine() – "инструмент" для вывода информации в консоль 

Помимо WriteLine() в Console есть и другие свойства и методы. Попробуйте найти в документации что еще можно делать через этот класс.

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

class App < // Определение метода public static void ShowCurrentDate() < // . >> 

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

За видимость отвечает слово public, оно дает возможность вызывать методы снаружи класса, как в примере выше. Если бы мы забыли добавить слово public, то метод считался бы private – приватным. Приватные методы нельзя вызывать снаружи класса.

class App < // Определение метода. Слово public пропущено static void ShowCurrentDate() < // . >> // вызовет ошибку компиляции: // error CS0122: 'App.ShowCurrentDate()' is inaccessible due to its protection level App.ShowCurrentDate(); 

За работу метода отвечают static и void.

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

void используется тогда, когда метод ничего не возвращает. Например такое определение у метода WriteLine() . А вот если метод возвращает какие-то данные, то вместо void будет указан тип возвращаемых данных. Подробнее об этом в следующем уроке.

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

Всё, что описывается внутри фигурных скобок <> после имени метода, называется телом метода. Внутри тела можно описывать любой код. Считайте, что это маленькая самостоятельная программа, набор произвольных инструкций. Тело выполняется ровно в тот момент, когда запускается метод. Причём каждый вызов метода запускает тело независимо от других вызовов. Кстати, тело может быть пустым:

// Минимальное определение метода public class App < public static void Noop() < // Тут мог бы быть код, но его нет // Обратите внимание на отступы // Для читаемости, любой код внутри тела сдвигается вправо на 4 пробела >> App.Noop(); 

Понятие «создать метод» имеет много синонимов: «реализовать», «определить» и даже «заимплементить» (от слова implement). Все они встречаются в повседневной практике на работе.

Задание

Реализуйте класс App со статическим методом с именем PrintMotto() , который выведет на экран фразу Winter is coming. Тесты будут вызывать ваш код вот так:

App.PrintMotto(); // => Winter is coming 

Чтобы мы могли вызвать этот метод снаружи, нужно его пометить не только ключевым словом static , но еще и public .

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

Упражнение не проходит проверку — что делать? ��

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

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

В моей среде код работает, а здесь нет ��

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя ��

Это нормально ��, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно ��

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

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

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

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

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

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

class Program < static void Main(string[] args) < >>

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

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

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

//Заголовок метода static void Main(string[] args) < //Тело метода >

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

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

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

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

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

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

/*Этот метод принимает два целых числа и *возвращает их сумму*/ static int Sum(int aFirstArg, int aSecondArg)

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

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

/*Этот метод принимает два целых числа и *возвращает их сумму*/ static int Sum(int aFirstArg, int aSecondArg)

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

static void Main(string[] args) < //Вызов метода Sum с фактическими параметрами int result = Sum(24, 6); //Вывод результата в консоль Console.WriteLine(result); >

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

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

class Program < /* * Данный метод выводит пользователю приглашение, * указанное в аргументе anOutputStr, получает введенную * с клавиатуры строку, преобразует её в целое число и * возвращает это число */ static int GetNumber(string anOutputStr) < //Вывод приглашения пользователю Console.Write(anOutputStr); //Получение строки string tmpString = Console.ReadLine(); //Преобразование строки в число int tmpArg = Convert.ToInt32(tmpString); return tmpArg; >static void Main(string[] args) < //Потенциально опасный блок try < //Первый вызов метода (получение первого числа) int firstArg = GetNumber("Введите первое число и нажмите клавишу Enter: "); //Второй вызов метода (получение второго числа) int secondArg = GetNumber("Введите второе число и нажмите клавишу Enter: "); //Сложение двух переменных int result = firstArg + secondArg; //Вывод результата Console.WriteLine("Результат сложения введенных чисел: " + result.ToString()); >//Блок обработки ошибок, SystemException - самый общий тип ошибок catch (SystemException) < Console.WriteLine("Во время выполнения программы произошла ошибка, вероятно, были введены некорректные данные!"); >> >

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *