Продолжаем улучшать читабельность и информативность программного кода.
Информативность и удобочитаемость зависит не только от комментариев и информативных имен переменных или структур данных. Основной проблемой при написании эффективного программного кода является повторяющиеся операции. К примеру, вывод сообщения на экран. Повторение в программе одного и того же кода, приводит к увеличению трудозатрат, к вероятности возникновения ошибке при наборе кода, страдает информативность и удобочитаемость.
Во избежание переписывания одного того же кода, принято выделять такой код в отдельный блок, с доступом по имени. По аналогии с переменной, в которой доступ по имени осуществляется к единственному значению, имя блока предоставляет доступ к программному коду внутри этого блока.
Выделение программного кода в отдельные блоки позволяет так же решить следующие задачи.
Наименьшим выделенным блоком программного кода в языке C# является — метод. К примеру, точка входа в программу метод— Main, или методы вывода на экран — Write и WriteLine.
Методы делятся на две группы. Методы, возвращающие значение и методы невозвращение значение. Аналогами методов в других языках программирования, являются функции и процедуры
Метод, не возвращающий значение — блок программного кода, результат вычисления которого, в дальнейшем, не используется в программе. Метод имеет следующую конструкцию
static void Metod()
{
Тело цикла. Здесь пишется блок исполняемого кода.
}
static — этот параметр примите как необходимость. Его обсуждение не входит в тему этой лекции
void — ключевое слово, указывающее, что метод не возвращает значение, которое может изменить ход выполнения программы
Metod — имя метода. По правилам пишется с большой буквы и имеет описательное содержание, которое описывает выполняемую функцию.
() — круглые скобки. Формат записи, указывающий на метод. Круглые скобки могут быть пустыми или содержать параметр.
{} — между фигурных скобок пишется исполняемый код.
Самая распространенная операция, которая не влияет на ход выполнения программы, а значит не возвращает никакого значения, является вывод информации на экран. Очень часто, таким сообщением бывает сообщение — Ошибка.
Выделим сообщение об ошибке в отдельный блок — метод, и вызовем этот метод в методе Main. Все операции производятся в class Program
class Program
{
static void Main(string[] args)
{
MessageError();
}
static void MessageError()
{
Console.WriteLine("Ошибка");
}
}
На первый взгляд, здесь происходит нарушение основного принципа программирования — следование. Метод MessageError() находится ниже метода Main. На самом деле это не так. Найдя строку MessageError();, компилятор находит в программе этот метод, выполняет его, и затем передает управление назад в метод Main. Поэтому нет разницы, где будет находится метод, ниже выше или в другом классе, или в другом файле, метод будет выполнен, в противном случае программа закончится ошибкой. При расположении метода за пределами базового класса Program, обязательно указывается путь к этому методу. Об этом поговорим чуть позже.
Как видно из вышеприведенного программного кода, использование методов очень похоже на применение переменных. По большому счету, операция Console.WriteLine("Ошибка"); как некое значение, была помещена в отдельный блок с именем, и теперь по имени можно вызвать эту операцию на выполнение.
Помимо разнообразных сообщений, методы, не возвращающие значение, могут выводить результаты вычислений. Для этого в круглых скобках метода объявляется переменная, называемая —параметром метода.
Напишем метод, умножающий значение переменной «х» на два.
static void Sum(int x)
{
Console.WriteLine(x * 2);
}
Здесь, в строке static void Sum(int x), параметр метода, метод Sum ожидает значение с типом данных int, которым будет инициализирована переменная int x.
Для того, чтобы воспользоваться методом достаточно вызвать метод по имени в методе Main, и в круглые скобки поместить значение. Значение в круглых скобках называется — аргумент. Аргумент должен иметь идентичный, с параметром тип данных.
class Program
{
static void Sum(int x)
{
Console.WriteLine(x * 2);
}
static void Main(string[] args)
{
Sum(30); //ПЕРЕДАЧА аргумента
// ОТВЕТ. Невидимая операция
}
}
Число «30» в строке Sum(30); является аргументом метода Sum. Саму же операцию передачи значения аргумента в параметр метода, можно представит как операцию инициализации переменной, в которой правым операндом является аргумент, а левым параметр.
В познавательном процессе о методах, встречаются ситуацию, когда обучающийся, написав свой метод не может к нему обратится. Это связано с тем, что ученик привык к мысли «одна операция — одно действие». Здесь же в строке Sum(30); происходит две операции — передача аргумента и получение ответа от метода в виде результата вычисления. Дабы избавится от визуальной зависимости «одна операция — одно действие», представьте, что ниже строки Sum(30); находится невидимая операция, принимающая ОТВЕТ.
Помимо литеральных значений, аргументом может выступать переменная.
class Program
{
static void Sum(int x)
{
Console.WriteLine(x * 2);
}
static void Main(string[] args)
{
int a = 30;
Sum(a); //ПЕРЕДАЧА аргумента
//ОТВЕТ. Невидимая операция
}
}
Здесь в качестве аргумента выступает значение переменной «а», которое инициализирует переменную «х», параметр метода Sum. После выполнения программного кода в теле метода Sum, результат вычисления возвращается методу Main.
Усложним задачу и напишем программу с несколькими параметрами, представленными различными типами данных.
class Program
{
static void Data(int x, string text)
{
Console.WriteLine($"Имя: {text}, возраст: {x}");
}
static void Main(string[] args)
{
int age = 30;
string name= "Bill";
Data(age, name); //ПЕРЕДАЧА аргумента
//ОТВЕТ. Невидимая операция
}
}
Здесь, аргументами выступают переменные age и name которые инициализируют переменные int x, string text метода Data.
В случаях, когда у метода два и более параметра необходимо соблюдать два правила.
1. Количество аргументов должно быть идентичным количеству параметров.
2. Типы данных параметров должны соответствовать по своему расположению типам данных аргументов. Т.е. первый параметр и аргумент должны иметь идентичные типы данных.
Помимо переменных, в качестве параметров могут выступать структуры.
Нижеприведен код программы, где метод ShowMany выводит на экран все элементы массива, а ShowOne — единственный.
class Program
{
static void ShowMany(int[] arr)
{
for(int i=0; i<arr.Length; i++)
{
Console.Write( arr[i] + " ");
}
}
static void ShowOne(int[] arr, int i)
{
Console.Write(arr[i]);
}
static void Main(string[] args)
{
int[] little = { 3, 6, 8, 9 };
int[] big = { 1, 2, 3, 6, 5, 4, 9, 8, 25 };
ShowMany(big); //ПЕРЕДАЧА аргумента
//ОТВЕТ. Невидимая операция
Console.WriteLine();
ShowOne(little, 1); //ПЕРЕДАЧА аргумента
//ОТВЕТ. Невидимая операция
}
}
Здесь, параметром ShowMany является массив, поэтому аргументом для этого метода будет массив. Метод ShowOne, позволяет обратится к отдельному элементу массива, но операция по выводу отдельного элемента массива происходит внутри метода, поэтому прежде, чем обратится к конкретному элементу, необходимо в метод ShowOne передать все элементы массива. Таким образом метод ShowOne имеет два параметра — массив и переменную инициализируемую индексом
Помимо методов с ключевым словом — void, т.е. не возвращающих никакого значения и не влияющих на дальнейшие вычисления, при написании программного кода, как ни банально звучит, используются методы, результат вычислений которых, возвращает значение, и эти значение используются в дальнейших вычислениях.
Такие методы легко отличить от методов с «void». Так как метод возвращает значение, а значение имеет тип данных, то ключевое слово «void» заменяется на один из принятых типов данных. Само значение возвращается с помощью оператор — return.
static string Name()
{
return "Bill";
}
Где, string — тип данных метода Text. Типом данных определены характеристики обрабатываемых значений.
Так как результат вычислений в методе с возвращаемым значением, в дальнейшем используется в коде программы, то такое значение присваивается переменной с идентичным типом данных.
class Program
{
static string Text()
{
return "Bill";
}
static void Main(string[] args)
{
string name=Text();
Console.WriteLine($"Имя {name}");
}
}
Оператор return выполняет две функции, возвращает значение и прекращает работу метода.
class Program
{
static string Text()
{
string name = "Bill";
return name;
string message = "Error";
}
static void Main(string[] args)
{
string name=Text();
Console.WriteLine($"Имя {name}");
}
}
Так как оператор «return» завершает работу метода, то операция с этим методом должна находится на последней строчке метода.
Используя параметры и аргументы методы могут обмениваться значениями.
class Program
{
static string Text(string name)
{
return name;
}
static int Number(int years)
{
return years;
}
static void Main(string[] args)
{
string name = Text("Bill");
int age = Number(36);
Console.WriteLine($"Имя {name}, возраст {age}");
}
}
Здесь, аргументами "Bill" и 36, были инициализированы переменные в методах Text и Number соответственно.
Для снижения трудозатрат и ошибок при наборе программного кода. выделяйте часто повторяющийся код в отдельные блоки — называемые методы. При написании программного кода используйте не только свои методы, но и сторонних разработчиков.
Для передачи значений между методами, к примеру, между Main и Sum, используется конструкция аргумент — параметр, где аргумент передает значение, а параметр принимает. Аргументом может быть как литеральное, так и переменное значение, параметром выступает переменная с типом данных идентичным аргументу.
На этом занятие закончено.
Вы можете самостоятельно найти задачи для закрепления теоретического материала или для получения задач с ответами отправьте письмо на basicprog@mail.ru
Удачи в выполнении практических заданий!