Методы класса
Если бы классы позволяли только описывать свойства объектов, то пользы от них было бы мало. Безусловно, мы хотим, чтобы объекты могли выполнять какие-то действия:
- выводили слова на экран;
- решали задачи;
- копировали данные с веб-узла;
- регулировали яркость фотографии;
- …и выполняли еще тысячи операций.
А теперь вспомните уроки, на которых вас учили сложению чисел. Вероятней всего, сначала учитель объяснял, КАК это делается, описывая, возможно, каждый шаг. Другими словами, в первую очередь рассматривался МЕТОД решения задачи определенного типа, то есть набор пошаговых инструкций, поясняющих порядок выполнения действий.
А следуя уже известному вам методу решения задач, вы справитесь с любыми похожими задачами.
Подобным образом, для того чтобы компьютер выполнял нужные нам действия, надо написать код, разъясняющий порядок их выполнения, то есть описать метод, который будет использоваться для выполнения необходимых действий, а затем применять этот метод при решении задачи подобного типа.
В языке C# метод позволяет описать порядок выполнения определенных действий. Описание метода называется программным кодом или просто кодом. В нужный момент метод может быть вызван. Компьютер читает код метода и выполняет именно то, что предписано.
Вот пример простейшего метода:
void SayHello() { }
Этот метод ничего не делает, потому что между фигурными скобками ничего не находится. Давайте зададим здесь какое-нибудь действие.
void SayHello() { Console.WriteLine("Hello"); }
(Придадим коду аккуратный вид и при помощи клавиши TAB создадим в методе отступы.)
Если вызвать этот метод, то на экран будет выведено слово "Hello". Задача не слишком сложная, поэтому и метод довольно прост.
Что означает VOID?
Странное слово void в приведенном выше примере может несколько озадачить, и вы можете поинтересоваться, зачем вообще его использовали. Вкратце остановимся на этом. Вспомните фильм о космических путешествиях: представьте безграничное пустое пространство во вселенной. Void означает пустоту, "ничего".
Использование слова void перед именем метода означает, что, когда завершается выполнение метода, возвращается пустое значение, то есть по завершении определенных действий, которые выполняет метод, он никаких значений не возвращает. В приведенном выше примере метода "SayHello" нас это вполне устраивает, поскольку после написания слова "Hello" возвращать ничего не нужно. Все необходимое было сделано во время работы метода.
Вы сможете лучше понять смысл этого слова, когда мы будем рассматривать случаи, где метод должен будет возвращать некоторый результат. Подобный пример появится немного позже.
Вызов метода
Написав приведенный выше код, мы объяснили компьютеру, КАК выводить приветствие на экран, но не сказали, КОГДА ему нужно воспользоваться приобретенным умением.
Это выглядит так, как если бы на уроке вам рассказали, как складывать числа, после чего вы записали метод, но решить задачку или пример вас не попросили.
Чтобы заставить компьютер выполнить действие, нужно вызвать метод. Для этого надо просто написать имя метода и поставить рядом круглые скобки:
SayHello();
Когда компьютер встречает эту строку, он понимает, что нужно выполнить команду, но встроенного метода с таким именем у компьютера нет, поэтому он лихорадочно начинает искать написанный вами метод с именем "SayHello". Если найти такой метод удается, он быстро выполняет все предписания, записанные в коде метода.
Затем возвращается к самому началу и, довольный успехом, получает вашу благодарность.
Как выполняется метод? Параметры метода
В предыдущем разделе мы познакомились с методами вкратце, но о них можно рассказать гораздо больше. Теперь рассмотрим более подробно, как передавать методу значения и получать значения, созданные при работе метода.
Предположим, вам потребовалось, чтобы компьютер вывел на экран следующий текст:
Hello Jo Hello Sam Hello You
Один из возможных способов — написать отдельный метод для каждого случая:
void WriteHelloJo() { Console.WriteLine("Hello Jo"); } void WriteHelloSam() { Console.WriteLine("Hello Sam"); } void WriteHelloYou() { Console.WriteLine("Hello You"); }
Затем необходимо вызвать их следующим образом:
WriteHelloJo(); WriteHelloSam(); WriteHelloYou();
Но ведь все три метода очень похожи. А что если написать один метод WriteHello, дополнив его соответствующими параметрами, и при каждом вызове просто передавать значение параметра, отличающее один вызов от другого?
Вот как это можно сделать:
void WriteHello(string someName) { Console.WriteLine("Hello " + someName); }
и затем вызвать метод следующим образом:
WriteHello("Jo"); WriteHello("Sam"); WriteHello("You");
Как видим, код позволяет сэкономить и занимаемое пространство, и затраченные усилия. Всегда старайтесь делать код как можно более кратким – чем короче программа, тем умнее программист.
Напишем метод подобным "умным" образом:
void WriteHello(string someName) { Console.WriteLine("Hello " + someName); }
Фактически мы говорим: "Каждый раз при вызове этого метода я буду подставлять строку символов с каким-либо именем. Любая подставляемая строка должна выводиться после слова "Hello".
Код в скобках ( string someName ) называется параметром. Параметр позволяет подставлять значение в метод при его вызове.
Когда вас обучали сложению, учитель не рассказывал о сложении всех существующих пар чисел, он просто научил методу и затем задавал разные задачи: "Сложите 2 и 5, а теперь 7 и 3". Это похоже на то, как если бы вам излагали метод сложения чисел, используя параметры: неважно, какие значения у параметров, - зная метод, всегда можно найти ответ для заданных значений.
Компьютеру все равно, какое имя вы присвоите параметру, важно, чтобы оно было единым при использовании во всем методе. Например, следующий код будет выполнен правильно:
void WriteHello(string x) { Console.WriteLine("Hello " + x); }
А этот с ошибкой:
void WriteHello(string someName) { Console.WriteLine("Hello " + someBodiesName); }
Вы заметили: параметры someName и someBodiesName отличаются — наш "электронный друг" не разберется в этой путанице и "разгневается".
Кроме того, в методе можно использовать не один параметр, а несколько, но нужно обязательно разделить их запятыми:
void WriteHello(string firstName, string lastName) { Console.WriteLine("Hello " + firstName + " " + lastName); }
А при вызове метода необходимо подставить правильное количество значений:
WriteHello("Petr", "Ivanov");
В данном случае на экран будет выведен текст "Hello Petr Ivanov".