C#: Какие бывают методы
Одна из базовых тем в C#, на которой строится код – классы и объекты. Базовая потому что все это появляется буквально с первых строчек кода, но она совсем не базовая с точки зрения понимания и использования. Поэтому изучение растягивается на множество уроков. В этом уроке, мы чуть больше окунемся в устройство языка, но не переживайте что пазл все еще не складывается, это нормально, мы пока не готовы полноценно говорить об ООП в C#.
Мы уже сталкивались с методами встроенными в C# в разных формах:
Console.WriteLine();
someString.ToLower();
someString.IndexOf();
File.ReadAllText();
Все подобные вызовы можно разбить на две группы: 1. Вызовы методов у объектов, таких как строки 2. Вызовы статических методов, наподобие метода Console.WriteLine()
, который мы используем в каждой практике.
Вызовы методов у объектов
Из объектов мы пока сталкивались только со строками, но принцип одинаковый для любых объектов. Ниже несколько примеров:
// Где-то здесь создаются объекты
// извлекает имя у пользователя
user.GetName();
// извлекает текущий день
currentDate.GetDayOfMonth();
// проверка того, что файл существует
file.Exists();
Такие методы выполняют действия над объектами у которых они вызываются и часто не принимают никаких аргументов. Объекты для простоты можно воспринимать как данные, которые доступны внутри метода. Например метод строки ToLower()
, внутри себя берет исходную строку, преобразует ее и возвращает результат наружу.
Вызовы статических методов
Но не все вызовы методов связаны с объектами. В тех случаях, когда действие есть, а объекта нет – используются статические методы. Что это может быть? Математические операции над числами или какие-то действия, которые не относятся к конкретному объекту, а имеют отношение ко всем объектам данного типа. В таком случае метод, почти всегда, опирается на данные, которые приходят в виде параметров. Console.WriteLine()
который мы используем в каждом уроке – один из таких методов. Еще примеры:
// Вычисление квадратного корня. Вызов напрямую из класса Math
Math.Sqrt(4);
// Чтение текста из указанного файла
File.ReadAllText("readme.txt");
Классы Console
, Math
и File
в данном случае нужны только для вызова, потому что методы определены внутри них. Но сами методы с классами не взаимодействуют, в отличии от вызовов методов у объектов.
Честно говоря, здесь не все так просто. Всегда можно придумать какой-то объект, над которым происходит вычисление. Так же верно и обратное, всегда можно обойтись без объектов. Есть языки в которых объектов нет вообще. В конечном итоге, все решают те кто проектирует конкретную часть кода.
Итого
- Статические методы вызываются прямо из класса напрямую. Они не связаны с конкретными объектами
- Не статические (методы объектов) вызываются у конкретных объектов и строят свою логику относительно данных самого объекта
Все это плавно подводит нас к возможности самостоятельно создавать классы, объекты и методы, без чего невозможно себе представить ни одну даже небольшую программу.
Задание
В переменной emoji
находится текстовый грустный смайлик -(. Ваша задача сделать этот смайлик веселый с помощью двух преобразований:
- Добавить слева глаза :
- Заменить ( на )
Должно получиться: :-). Выведите его на экран.
Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект
Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества
Ваше упражнение проверяется по этим тестам
#load "/src/Init.csx"
#load "/src/RedirectOutput.csx"
#load "Exercise.csx"
;
using PowerAssert;
var output = capturedConsoleOutput.ToString().Trim();
Console.SetOut(originalStdOut);
Console.Write(capturedConsoleOutput);
PAssert.IsTrue(() => output == ":-)");
Решение учителя откроется через:
20:00
