Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Урок 8. Методы. Рекурсия.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
81.07 Кб
Скачать

34: // Delay.

35: Console.ReadKey();

36: }

37: }

38: }

Обратите внимание, на 10 строке мы уже создаем только один метод Operation. Если у нас здесь было их 4, и вот этот метод Operation… Давайте мы попробуем их немножко сличить. Смотрите, вот они. И здесь у нас уже используются работа с опциональными параметрами. И если вы зайдете в презентацию, вот они опциональные параметры. Мы здесь уже используем опциональные параметры и вот опциональные параметры позволяют нам избавится от множества перегрузок. И сейчас мы посмотрим, как мы избавляемся при помощи опциональных и даже при помощи немножко именованных параметров от множественных перегрузок. На 10 строке мы создаем метод Operation с тремя опциональными параметрами, или тремя опциональными аргументами. Первому параметру value1 мы присваиваем значение по умолчанию «val», value2 присваиваем значение по умолчанию 10, value3 присваиваем значение по умолчанию 12,2. Когда мы вызываем Operation и ничего не передаем, это аналог первой перегрузки из предыдущего примера. Когда мы вызываем метод Operation и используем здесь только один параметр, это аналогично второй перегрузке, потому что вот этот и этот параметр выполнится автоматически и мы здесь можем взять и заменить val на что-то другое. Допустим «First», потом «Second», здесь «Third». Мы вызываем метод Operation с 10 строки. «val» мы заменяем на F, но value2 и value3 так и остается, оно остается значениями по умолчанию. На 19 строке мы еще раз вызываем метод Operation с 10 строки. В качестве первого аргумента мы передаем S, а в качестве второго мы передадим 11. Помните чему равно число 11 в двенадцатеричной системе? 13. Плохое число. И мы смотрим что теперь в нашем случае у нас вот сюда в value1 подставится S в value2 подставится 11, а вот value3 останется равно 12,2. Здесь мы можем поставить при третьем вызове 22 и 3,14. Вот у нас пошел аналог четвертой перегрузки. Смотрите, как гибко позволяют нам работать с методом опциональные параметры. Наличие опциональных параметров позволяет не указывать их при вызове метода, потому что они уже имеют некие значения по умолчанию, которые будут подставляться в тело метода, а тело метода представляет собой набор инструкций, содержащих в себе рабочий код. И вот мы видим, что сюда подставляется третий, сюда второй… Сюда подставляется 12,2, сюда поставляется 10, сюда подставляется value1. И теперь если мы вот это вызываем, вызываем метод и подставляем только один параметр, что у нас получится? У нас выведется F, 10, 12.2. А если мы вызываем следующий метод с 19 строки, то здесь у нас будет S, 11, 12.2. В третьем случае, как мы понимаем подставится все три пользовательских. Давайте посмотрим еще на некоторые ограничения. Убираем комментарий с 25 строки. Возникает ошибка. Почему ошибка? Давайте посмотрим. Смотрите сколько всего вывелось! Иногда сложно проанализировать большой набор ошибок. Мы посмотрим первую. Cannot define overloaded method 'Function' because it differs from another method only on ref and out. Переходим и смотрим. Это вообще осталось со старого примера. Подходит она нам? Не подходит, но мы помним. А почему они остались, потому что мы не перебилдили наше решение. И потому если мы сейчас зайдем, поставим комментарий и нажмем F6. Перебилдили, возвращаемся. У нас снова появляется ошибка. Заходим в List Error. Ага, уже меньше стало. По крайней мене нас интересует 25 строка именно этого файла 004_Method. У нас есть множество, даже старые ошибки. Поэтому будьте осторожны, но не пугайтесь этого Error List. Вот то что нас интересует. Argument 2 cannot convert from 'double' to 'int'. Второй аргумент, а второй аргумент у на какой? Int. И поэтому система думает, что вы хотите первым аргументом поставить строку «Alex» и она подставится в этот параметр, а вот этот я пытаюсь подставить в value2. Это double параметр 12,2. Давайте вспомним кастинг. Что такое кастинг? Преобразование значений типов. Кастинг бывает явным и неявным, опасным и неопасным. В данном случае здесь используется опасный кастинг, потому что здесь теряется точность числа. Обрежется вот эта двойка, поэтому я не могу тебе преобразовать его. А что же мне делать? Обратите внимание, он не хочет преобразовывать. Давайте посмотрим еще вот так. А если я укажу явное преобразование значения типа к int. А сейчас нажимаем F6 и ошибок нет. То есть получается мне нужно учитывать что здесь работаю именно со вторым параметром, а мне вот показалось, что я работаю с третьим. Мне неправильно показалось. Многие могут думать что здесь искусственный интеллект, он сам подумает и подставит куда нужно. Так не получится. Имеется такое вот правило. Поэтому мы можем либо вот так подставить int сюда как решение этой проблемы. То есть использовать оператор явного преобразования значения типа. То что я рассказывал, вы можете здесь в комментариях тоже прочитать. И теперь смотрим, чтобы все-таки хоть как-то организовать правильно этот вывод. Мы делаем вот что. Обратите внимание, первым параметром указываем строку «Alex», попадает вот сюда это значение. И здесь мы указываем, используем технику… Если вот эта техника создания методов называется техника опциональный параметров, то при вызове метода – техника именованных параметров. Значит мы совместно с техникой опциональных параметров используем технику именованных параметров. Мы здесь явно указываем имя параметра, которому мы хотим присвоить 12,2. Здесь же у нас получается… Мы здесь не указываем… И здесь что получается? Во второй параметр вставится значение по умолчанию. То есть запомните пожалуйста это правило. И смотрим дальше. А если я хочу упустить имя. Например, здесь по умолчанию имя User, я хочу упустить имя. Если я попробую без именованных параметров, то снова же будет ошибка. Поэтому я должен явно указать имена тех параметров, которым я хочу присваивать значения. Даже если я просто хочу их поменять местами. Почему бы и нет, давайте попробуем. Берем и вставляем сюда. Вот пожалуйста, мы поменяли их местами. Но так как у нас используется техника именованных параметров, то здесь мы можем их перепутывать как хотим. Но что мы с вами знаем, что этим злоупотреблять не следует, потому что нам с вами нужно писать чистый код с правильными именованиями, с правильными последовательностями. Он может нам только помочь декорировать наш код, сделать его удобочитаемым, потому что правило отдавать предпочтение удобочитаемости вашего кода. Чтобы другие его тоже читали. Если выбирать между быстродействием и удобством, мы выбираем удобство. Потому что коды промышленные и вы где-то сэкономите и еще неизвестно как эта сомнительная производительность, действительно ли она будет, а мет она не совсем будет. Поэтому мы всегда отдаем предпочтение чистому удобочитаемому коду. Хорошо. Мы переходим с вами дальше.

Здесь мы немного поговорим о методе Main. Часто задают вопросы о том, как работает метод Main. Мы должны понимать что в языке C# метод Main – это фиксированное имя, в каждой программе за исключением некоторых, мы эти программы разберем дальше, используется метод с именем Main. Этот метод по сути является точкой входа в нашу программу. Что значит точка входа? Когда мы запускаем нашу программу на выполнение то виртуальная машина начинает ее читать, и ей нужно найти место, с которого можно начать читать. С какой строки ее читать. С 23? Или, например если у нас много методов, как в предыдущих примерах. С какого метода мне начать ее выполнять. Так вот была разработана такая семантика, такой смысл, что именно метод Main будея являться главной основной точкой входа в программу. И когда наша программа будем выполнятся мы подразумеваем, что все выполнение начинается с метода Main. И когда мы нажимали F11, мы становились на первую строку, где открывающая операторная скобка этого метода и с нее начиналось все выполнение. Замечательно. Ну, на самом деле если сильно постараться, конечно на C# невозможно такого сделать, но на промежуточном языке MSIL можно назначить любой метод точкой входа, но на C# такого сделать невозможно и нам приходится довольствоваться методом Main. Именно с большой буквы, потому что мы помним, что язык С# Case Sensitive. Метод Main может возвращать только два типа значений: int и void. Давайте посмотрим, что написано здесь в комментариях.