При создание первой консольный программы на C# в Visual Studio вы увидите простой каркас.
Фрагмент 1.18
class Program
{
static void Main(string[] args)
{
}
}
Это программа содержащая один единственной метод Main и класс к которому этот метод относится Program. Понятие классов будет рассмотрено в следующей главе. Пока просто запомните что любой метод должен быть описан внутри какого-либо класса.
Этот метод является точкой входа в программу, именно из него вызываются основные методы нашей программы, которые в свою очередь вызывают другие методы и т.д. Технически, метод – это переход к какому-то именованному блоку инструкций, а потом возврат из него. Это я наглядно покажу после того, как мы освоим базовый синтаксис.
Вызов метода
При вызове метода мы переходим в его тело и начинаем выполнять вложенные в него инструкции. Для вызова нам нужно применить к его имени оператор вызова, который представляется круглыми скобками. Внутри этого оператора через запятую мы перечисляем аргументы метода, те данные которые он от нас требует.
Например для вывода сообщения в консоль мы можем использовать метод Console.WriteLine который принимает данные для вывода.
Фрагмент 1.19
Console.WriteLine(“Hello World”);
В данном случае мы его вызвали и передали строку “Hello World” в качестве аргумента. Так как круглые скобки это оператор, в конце строки с ними должна стоять точка запятой.
Помимо этого, метод может возвращать данные, которые в языковых конструкциях воспринимаются как результат выполнения оператора вызова. Так что вызов метода можно встретить в самых неожиданных местах. Например у нас есть метод Console.ReadLine который ничего не принимает (одна из перегрузок), но возвращает строку введенную пользователям в консоли. Он забирает управление, считывает символы которые пользователь вводит и возвращает управление с получившейся строкой после нажатия на enter.
Фрагмент 1.20
Console.WriteLine(“Введите имя:”);
string name = Console.ReadLine();
Как вы понимаете методы могут также принимать и возвращать значения в одном вызове. Например метод возведения числа в степень.
Фрагмент 1.21
double result = Math.Pow(10, 2);
Возводим число 10 во вторую степень.
Объявление метода
Это всё не имело бы смысла если бы не могли бы определять свои методы.
Выглядит это следующим образом
Модификатор ТипВозвращаемогоЗначения Имя (ТипПараметра ИмяПараметра,)
{
тело метода
}
- Под модификаторами подразумевается широкий спектр ключевых слов большую часть из которых мы рассмотрим далее. Пока что мы всегда будем указывать private static.
- Тип возвращаемого значения – это тип явного результата метода. Мы можем указывать любой доступный тип. Например если мы указываем int, то это означает что результатом работы метода будет какое-то число.
- Через имя метода мы его обычно вызываем.
- Список параметров нужен для указания того, что методу нужно. Если указываем через запятую два параметра с типом int то это значит, что при вызове метода, ему должны быть переданы два числа. Имена параметров нужны для оперирования ими в теле метода.
Для примера давайте определим метод, который возвращает количество повторений определенного символа в тексте.
Фрагмент 1.22
static int GetSymbolCount(string text, char symbol)
{
int count = 0;
for(int i = 0; i < text.Length; i++)
{
if(text[i] == symbol)
{
count++;
}
}
return count;
}
Здесь есть ряд интересных моментов
- Мы можем использовать строку как массив символов (значений с типом char).
- Если у метода тип возвращаемого значения не void то он должен обязательно вернуть какое-то значение этого типа при любом исходе. Возвращение значения (и прерывания выполнения метода) происходит с помощью инструкции return.
Воспользоваться им мы можем вот так
Фрагмент 1.23
int aCount = GetSymbolCount("Roma said that programming is easy", 'a');
Вызов метода – это переход в начало его тела и превращение параметров в локальные переменные с инициализацией их значениями соответствующих аргументов.
Метод выполняет до своего конца или до инструкции return. После выполнения мы возвращаемся в точку его вызова. Если мы укажем в качестве возвращаемого значения void, то можем не использовать return, а если будем использовать то должны это делать без значения так, как указали что он ничего не возвращает.
Поток выполнения
При вызове метода мы перемещаемся в начало его тела, а инструкция return возвращает нас в то место, где был этот вызов. Точек вызова метода может быть много, и возвращаемся мы именно в ту точку, из которой произошел именно этот вызов.
Попробуйте проследить за этой программой и вычислить что будет выведено в консоль.
Фрагмент 1.24
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Main");
Method2();
Method3();
Method1();
Console.WriteLine("End");
}
private static void Method1()
{
Console.WriteLine("Method1");
Method2();
}
private static void Method2()
{
Console.WriteLine("Method2");
Method3();
}
private static void Method3()
{
Console.WriteLine("Method3");
}
}
Для некоторых будет удивительно, но выведет следующее:
Main
Method2
Method3
Method3
Method1
Method2
Method3
End