Full transcript
0:00приветствую вас друзья меня зовут сергей
0:02мы с вами продолжаем изучать язык
0:03программирования си sharp
0:04сегодняшняя тема нашего урока оператор
0:06условного нал выясним что это такое для
0:09чего нужен и как он используется в этом
0:11уроке у нас будет довольно простой
0:13пример на основе того что мы изучили так
0:15и более сложный на основе
0:16объектно-ориентированного
0:17программирования и скажем так на примере
0:20который повсеместно довольно часто
0:22встречаются в реальных приложениях
0:23возможно вам будет сложно понять вторую
0:26часть данного урока
0:27тем не менее я считаю что ее стоят здесь
0:29разместить потому что это типичный
0:31пример использования данного оператора
0:32любом случае в дальнейшем всегда можете
0:35вернуться и посмотреть этот урок снова
0:37для того чтобы освежить ваше знание об
0:39этом операторе не забудьте подписаться
0:41на канал жмакнуть колокольчик чтобы не
0:43пропускать следующие уроки но теперь
0:44непосредственно к делу для начала
0:46рассмотрим ситуацию когда у нас вообще
0:49возникнет необходимость использования
0:50оператора условного нал кстати выглядит
0:53он вот таким вот образом
0:54вопросительные знаки . итак у нас есть
0:58некий метод который возвращает нам acer
1:01в данном случае это у нас простой пример
1:03мазер end of как я уже говорил это может
1:05быть абсолютно любая информация массив
1:08чего угодно и запрашиваться данную
1:09информацию на сможет из базы данных к
1:11каким-то счастье перекрестном какому-то
1:13этим в данном случае у нас в качестве
1:16заглушки такого запроса выступает ггт
1:19рай и в текущей своей реализации он нам
1:22вернет массив из трех элементов где у
1:24нас будут храниться цифры один два и три
1:26на 24 строчки кода в мы вызываем данные
1:30метод и в переменной r и получаем его
1:32результат в дальнейшем на 24 строчки
1:34кода мы считаем сумму элементов данного
1:37массива с помощью метода расширения сам
1:39если мы сейчас этого запустим то все без
1:41проблем неплохо работает но как я уже он
1:44сказал этот метод гетерой у нас является
1:47заглушкой и эмулирует ситуация когда мы
1:49получаем эту информацию с какого-то
1:50внешнего источника существует
1:52вероятность что из внешнего источника
1:53вместо реальных данных нашем массиве нам
1:56придет нал в таком случае если мы
1:57запустим наш программку мы получаем
1:59исключение давайте выясним более
2:01подробно почему мы это исключение
2:03получили на 24 строчки кода в нас
2:05брейк-пойнт пускаем дебаггер с помощью
2:08клавиши f5 с помощью клавиши f10
2:11делаем шаг и мы видим что в нашем
2:13массиве сейчас знал потому что метод
2:15гетерой нам вернул нам вместо реальных
2:17данных ну вот почему и данном случае на
2:20двадцать шестой строчке кода где у нас
2:22вывод в консоль мы пытаемся обратиться к
2:24объектам и рык переменной май рыб
2:26вызвать у неё метод сам чтобы она
2:29посчитала сумма алиментов всех массивов
2:31как она это может сделать если у нас там
2:34сейчас снова вспоминаем урока ссылочных
2:36и значимых типах и мы понимаем что у нас
2:39по факту есть ярлык который не ссылается
2:42на реальные данные в куче
2:44соответственно мы пытаемся сложить
2:46какие-то элементы которые не существуют
2:49потому что нет на нас мы сила с
2:50элементами в реальности у нас только
2:52ярлык который не присвоена ссылка на
2:54данные управляемой кучи ответственно
2:57попытавшись это сделать мы получаем
2:59исключение
3:00типичная ситуация как это можно обойти
3:02это выполнить проверку на нал нашего
3:05массива
3:06если допустим dismal то мы будем
3:08выводить сообщения с ума элементу
3:10массива март допустим тогда потому что
3:15нет у нас массе никаких элементов иначе
3:18мы реально выполняем наш код в таком
3:21случае мы не получим exception потому
3:23что мы проверяем все это дело на нал и
3:25если мы сейчас добавили все это
3:27запускаем выполняется проверка на налог
3:30и исполняется именно та ветка где мы не
3:32обращаемся к массивах котором много
3:33просто выводим сообщение что сумма
3:36элементов массива 0 идем дальше как
3:38видите у нас существенно увеличилась
3:40размерность нашего кода и нас такое дело
3:43понятное дело не устраивает давайте все
3:45это откатим обратно и в данном случае
3:49нам поможет
3:50оператор условного но вместо того чтобы
3:52делать все это проверку на нал
3:54мы вот здесь прежде чем мы обращаемся к
3:57нашему массиву
3:57можем поставить ? и далее . что теперь
4:00изменится по в ходе выполнения нашей
4:02программы прежде чем обращаться к нашему
4:06массиву пытаться сложить его элементы
4:09будет выполнена проверка на на ул так
4:11вот если в момент вызова вот этого
4:13оператора в нашем массиве будет на а то
4:16дальнейший ход выполняться не будет
4:18соответственно у нас не будет попытки
4:19складывания не существующих элементов
4:21результате этого выражения если в
4:24массиве был налто вместо того чтобы
4:25выполнять вот этот код у нас здесь таки
4:28останется на давайте запустим это всегда
4:31баги смотрим в массиве у нас щас нал и
4:33если мы выполняем код на двадцать шестой
4:36строчке кода у нас просто выводиться
4:38сообщение сумма элементов массива но как
4:40видите 0 там нигде нету той простой
4:43причине что к вот этой фразе сумма
4:45элементов массива мы добавили канал то
4:47бишь ничего но если в нашем массиве
4:50будут реальные элементы и мы запустим
4:53такой код то нас выполнится и элементы
4:56массива у нас будут подсчитаны давайте
4:58вернем опять ситуацию как будто в нашем
5:00массиве у нас будет нам
5:02что нам делать если мы все-таки хотим
5:04выводить какое-то дефолтное значение
5:06если вы смотрели прошлые уроки вы знаете
5:08что у нас существует еще и оператор
5:10объединения снов и в позапрошлом уроке я
5:13упоминал что оператор объединения стал
5:16часто очень часто используется именно с
5:19вот этим вот оператором оператором
5:21условного на таким образом мы их можем
5:24комбинировать случае если в нашем
5:25массиве будет на а вот этот код у нас
5:28выполняться не будет то есть методом сам
5:31но вместо вот этого всего вот этого
5:34всего что я выделю у нас будет нал
5:37соответственно здесь мы можем
5:38использовать оператор объединения сноу и
5:41выводить дефолтное значение единственный
5:44нюанс это выражение нам нужно взять в
5:46скобочки чтобы она корректно
5:48распознавала с при конкатенации со
5:51строкой запускаем еще раз все это виды
5:53баги в массиве у нас сейчас знал
5:55соответственно этот оператор проверяет
5:57наш массивом видишь что там на а он не
6:00будет вызывать метод сам но как
6:02результат
6:03вместо вот этого всего выражения мы
6:06получаем нал далее у нас идет оператор
6:09объединения снова он проверяет это
6:12результат видит что-то нал и подставляют
6:14дефолтное значение 0 как результат на
6:17консоли мы получаем сообщения сумму
6:18элементов массива 0 если же в нашем
6:21массе я не нал а реальные данные
6:23запускаем de bani
6:25ну вот масс массивно три элемента антами
6:27с этим 23 что у нас в этом случае
6:30произойдет наш массив провериться с
6:32помощью этого оператора он видит что-то
6:34мне мал и ответственно будет вызван
6:36метод сам далее оператор объединения
6:38снова проверяет все что то у нас
6:40получилось он видит что у нас нам сумма
6:42реальных чисел они нам соответственно
6:44дефолтное значение использоваться не
6:45будет и мы консоль мы получим сообщение
6:47о сумму элементов массива 6 теперь
6:50рассмотрим ещё один пример типичную
6:52ситуация которая он придет встречаться в
6:54постоянно когда вы будете разрабатывать
6:56приложения на языке программирования си
6:58шер у нас здесь есть класс person этот
7:01самый класс который мы использовали в
7:03позапрошлом уроке где показывал пример
7:05работы с оператором объединения сноу на
7:08примере winforms кстати сегодня у нас
7:11тоже будет примерно winforms
7:13если мы посмотрим на реализацию этого
7:15класса там у нас имеется три поля со
7:17своими данными со камней мото фамилия
7:19имя отчество и в данном случае у нас
7:21добавилась
7:22еще одно поле это контакты данного
7:24человека эти контакты у нас реализованы
7:27в отдельном классе в данном случае мы
7:30ограничились телефонным номером и
7:32email если мы вернемся непосредственно к
7:34нашему коду то мы видим что если у нас
7:37создан объект класса parsun мы должны
7:39обратиться через точку к нему получить
7:42доступ к его контактам и далее мы можем
7:44получить уже доступ к телефонному номер
7:46на каждом из этих шагов мы можем
7:49получить нам reference exception каждый
7:52из объектов этого класса и сам объект
7:56класса торсон и контракты и фоном барр
7:59это
7:59ссылочные типы соответственно в каждом
8:03из этих полей
8:04везде каждом элементе этой цепочки мы
8:06можем наткнуться на но соответственно
8:08можно получить на убрав индекс общин для
8:10начала давайте рассмотрим благополучный
8:13исход ситуации итак наша с вами задача
8:16получить телефонный номер этого человека
8:19и вывести его на консоль в этом простом
8:22примере опять-таки мы рассматриваем
8:24ситуации когда информацию об этом
8:26человеке мы получаем от кто-то извне
8:28база данных и щеки запрос неважно
8:31соответственно мой как мы можем получить
8:33себе полную информацию о человеке так и
8:35частичную такие допустим вообще можно
8:38получить нал и соответственно
8:39обратившись к этому полю получим новый
8:41francisco сообщи в данном случае почти
8:44заглушки у нас выступает опять-таки me
8:46to get тоже сам ставим брейк пойнта 24
8:49строчки кода и в данном случае в данной
8:53реализации нашей заглушки мы реально
8:55получаете данные который нам нужны нам
8:57возвращается объект класса парсон у него
9:00создан объект класса compact и
9:02соответственно у него есть фон набор
9:04куда мы печатали вот такую вот заглушку
9:06мы преспокойненько получаем доступ к
9:08этому филда то есть поле
9:10вот какие данные у нас переменный фоном
9:12барр для наглядности я просто сохраняя
9:15ее отдельно но в принципе мы могли бы
9:16сразу вводить информацию вот сюда в
9:18конце ну и в дальнейшем мы этот номер
9:21выводим на консоли теперь рассмотрим
9:23такую ситуацию мы сделали запрос к базе
9:25данных допустим и вместо реального
9:28объекта класса person
9:29но вернулся нам
9:30теперь смотрите вот здесь мы пытаемся
9:33обратиться к полю контакты к телефонному
9:35номеру
9:37у объекта классы по лесам но признал
9:41то есть у нас есть первый для объекта
9:44класса процессом а реальных данных
9:45управляем на куче нет соответственно
9:48если мы попытаемся обратиться к реальным
9:50данным классов person например кива
9:52контактным к фоном барр по их нету мы
9:56получаем доллары френдс exception
9:57соответственно для того чтобы в данном
9:59случае
9:59избежать подобной ситуации мы должны
10:02выполнить проверку нашего объекта
10:04персонал чтобы там ни был мал и так у
10:07нас дикси класса персонал мы вообще
10:09ничего не выверено консоль
10:11конечно мы можем здесь составить
10:12какой-то код допустим написать вот так
10:15нет данных и случай если у нас в объекте
10:18класс a person
10:19ничего не была во владении данных потому
10:21что код не выполнился хорошо
10:23представим что нам теперь все таки
10:25вернулся какой-то объект класса тоже без
10:28проблем запускаем наш код и еще раз
10:31объект was a person as вернулся мы
10:33попадаем в тело iv обращаемся класс a
10:35person не обращаемся к контактам
10:37смотрите что у нас сейчас vkontakte
10:40vkontakte у нас нал ну нет у него
10:42контактов с нам опять получаем на ура
10:45фрицек сообщить соответственно либо
10:47здесь внутри нужно еще один из
10:48дописывать и проверять контакты теперь
10:51еще на нал и вот так вот все делать либо
10:54же вот так нужно сделать проверять на то
10:56что тоже summer in anal и контакты не
10:59равно тогда вот этот код нам не
11:00понадобится в любом случае что так что
11:02до кода разрастается и поехали дальше
11:05теперь у нас в person не нал
11:07а в контактах нал этот код не
11:09выполняется в теле блока if
11:12соответственно мы получим вывод не отдам
11:14теперь давайте добавим сюда еще контакты
11:17создадим ему контакты
11:18но в самих контактах у нас нету допустим
11:22телефона мы не писали логику телефон
11:24смотрим что у нас будет теперь я думаю
11:27вы уже догадываетесь
11:28что что наснимал в контактах у нас не
11:30нал опять мы попадаем в блоков фоном
11:34брана snow
11:35соответственно здесь у нас в этой
11:37переменной нал и на вывод мы получаем
11:40ничего но это хорошо что метод writeline
11:43класса консоль может работать снова если
11:45мы должны с этим телефоном были еще что
11:47то делать там и вы получили еще один
11:49мало reference xf таком случае нам нужно
11:51дописать еще одну проверку и проверяет
11:53что еще и конном бы равен
11:55но таким образом наш код все
11:57разрастается разрастается и разрастается
11:59во избежание вот этого всего мы можем
12:02использовать оператор условного на
12:03давайте теперь все это же сделай но
12:06только с оператором условного нам
12:08выбираем этот лишний код каждый момент
12:11где у нас есть вероятность того что мы
12:13получим нам
12:14мы должны использовать литературу словно
12:17смотрите данном случае я стою вот здесь
12:20в объекты класса person мы получим нал
12:22давайте сейчас запускаем у нас там
12:24сейчас нал наш оператор условного на
12:26проверяют есть пита но если там реально
12:28налто вот эта вот вся цепочка который
12:30идет дальше она уже не будет выполняться
12:32просто в переменную фоном барр нос при
12:34свой канал ну и дальше мы на консоль
12:37ничего не получит соответственно так как
12:39мы с вами рассмотрели ситуацию когда в
12:41этой цепочки и в контактах может быть
12:44нам и в самом телефоне может быть нам
12:46нам нужно всю цепочку
12:48проверять потому что если где-то в этой
12:50цепочке у нас будет новый мы обратимся к
12:52объекту в котором но мы получим новый
12:54рефрен секс шоп соответственно если у
12:56нас допустим будет вот такая ситуация
12:58когда у нас позже саннин all the
12:59vkontakte0
13:00и вот здесь мы не проверяем наши
13:02контакты с помощью оператора условного
13:04наук и вот здесь при обращении контактам
13:05мы обратимся к несуществующим данным и
13:08все равно получаем доллары france
13:09exception то есть в этой цепочке научи
13:11вот здесь нужно добавить
13:12оператору словно в таким образом
13:14это получается как будто ну некие вагоны
13:18поезда для того чтобы избежать крушения
13:20нам нужно выполнить вот эту цепочку
13:21pro.ru нас выполняется ярко персонал
13:24если там не нал то мы обращаемся
13:27контактам и выполняется проверка
13:29контактов на на контактах у нас же знал
13:32поэтому мы уже не будем обращаться
13:33пытаться обратиться к полю фон на борт
13:35потому что я просто не существует и
13:37сразу же поместим нашу переменную фон
13:39обр временное значение на ул но как
13:42видите при такой реализации мы на вывод
13:44ничего не получаем и здесь имеет смысл
13:46использовать дефолтное значение а для
13:50плотного значения у нас есть оператор
13:51объединения знал два знака вопроса как я
13:54говорил эти два оператора оператор
13:57объединения снов вот этот оператор
13:59условно в вот этот они очень часто
14:01используются вместе и здесь мы допустим
14:03напишем нет данных если мы в этой всей
14:05цепочке которой мы проверяли с помощью
14:07оператора условно в
14:09вот здесь так и не получили реальные
14:11данные то есть у нас все равно где-то
14:12здесь встретился мал вот в этом всем
14:15выражении то наш оператор объединения
14:18снова выглядит этот но и в качестве
14:21диффузного значения приходят сообщения
14:23нет данных данном случае у нас в объекте
14:25person была информация в контактах он
14:28основал соответственно дальше выполнения
14:29не пошло после этого всего оператор
14:32кабине я снова увидел здесь но в этой
14:34части кода и присвоил фоном барр
14:36дефолтное значение на вывод мы получили
14:38нет данных тоже есть у нас изначально
14:39вместо объекта класса торсен будет нам
14:42все отработать точно так же ну что мы
14:44всю цепочку проверяя если же у нас
14:46вернулся decals a person с контактами и
14:49с телефонным номером вот эта вся цепочка
14:51проверок на нал у нас отработает
14:54далее этот оператор видит что здесь есть
14:57реальные данные и фоном барр мы получаем
15:005 по нам борт и выводим его на консоль и
15:03вот эта перемена мы использовали для
15:05того чтобы просто наглядно было видно
15:06какие реально данные у нас получается
15:09после обработки всей этой цепочки на
15:11самом деле она не нужно мы можем сразу
15:13вот так делать
15:15таким образом объем кода у нас учить
15:18сокращается и мы соответственно получаем
15:20все нужные нам проверки
15:21теперь же давайте рассмотрим ещё один
15:23пример работы с оператором условным орал
15:25на примере нашел простого приложения
15:28который мы писали на winforms
15:30позапрошлом уроке задачей данного
15:32приложения является вывод списка не этих
15:35персонажей и в позапрошлом уроке при
15:37нажатии на кнопку рану нас выводилось
15:39информация только фамилии имени и
15:41отчестве данном уроке я добавил
15:42возможность выводить еще контактную
15:44информацию виде номера телефона если мы
15:47нажимаем кнопочку ран у нас водится
15:49практически все то же самое но только
15:51добавилось еще позиция фоном барр и как
15:53видите у нескольких персонажей такого
15:56телефона нету но одного из них есть
15:57номер телефона в данном случае для
15:59примера здесь просто набор цифр это
16:01абсолютно тот же класс парсон который мы
16:03с вами только что использовали мы вам
16:05можем использовать в проекте лосины по
16:07той простой причине что в данном проекте
16:10качестве ссылки у нас подключен проекта
16:12lesson on wf a8 wf это именно вот
16:16проектную информ который мы писали так
16:18вот в этом проекте у нас есть тот самый
16:19класс прошлом который мы только что
16:21рассматривали и разница лишь в том что
16:23нужно добавилось дополнительное поле
16:24контакты
16:25здесь у нас может содержаться телефонным
16:28анапе e-mail но email и в данном случае
16:30не используя используя только
16:31телефонный номер и вот он самого класса
16:35parsun
16:36мы добавили помимо метода get full name
16:38которые мы использовали в позапрошлом
16:40уроке для вывода информации здесь не
16:42будем повторно смотреть здесь ничего не
16:44поменялось мы добавили еще не пакет
16:46фоном барр и здесь в этом методе гид по
16:48набору на собственно выполняется те же
16:50самые проверки с помощью оператора
16:52условного нал делается это по той же
16:54самой причине потому что если мы
16:56допустим получаем список объектов класса
16:58пашин откуда-то извне и то не факт что
17:01там будут контакты и не факт что в
17:03контактах будет именно телефонный номер
17:04возможно там будет только email или
17:06вообще ничего не будет соответственно
17:08вот эти все проверки реализованы в
17:10нашими attacked это джейсон амбар
17:12который нас возвращает строку которая
17:14формируется общение фона бар и
17:15соответственно
17:17тот самый телефонный номер если вам есть
17:19если же его нет то в качестве дефолтного
17:21значения будет возвращено записи нет
17:23данных логика работы абсолютно точно
17:25такая же
17:26какую мы использовали под здесь но
17:28только здесь она скажем так на более
17:30конкретном примере
17:32ещё раз посмотрим логику которая у нас
17:34отрабатывает при нажатии на кнопку ран
17:37весь у нас есть небольшие изменения но
17:39во первых это выйдет то шанс которая нас
17:41возвращает список людей наша заглушка мы
17:43его модифицировали той что для одного из
17:45них у нас добавляется еще контакт вот у
17:47нас есть некий а но он которую мы не
17:49знаем для него создается объект комплект
17:52и в более набор добавляет цена
17:54соответственно у одних людей получается
17:56так что номер телефона есть а других нет
17:58опыт этих троих во-первых поле контактов
18:01будет мал и соответственно никакого
18:03телефонного номера там не будет ну out
18:05to 4 будет соответственно именно поэтому
18:08нам и нужна вот эта проверка если у нас
18:10вообще нету контактов или не по
18:12телефонного номера до соответственно у
18:14нас будет выводиться сообщение
18:16нет данных ну и у нас немножечко
18:19модифицирован вывод этих самых сообщений
18:21в listbox это вот сюда мы перебираем
18:24список всех элементов типа торсом и
18:28у каждого из них вызываем метод get full
18:31name и помимо этого вызываем get phone
18:34number соответственно под get фон и нам
18:37формируют запись фамилии имени и
18:40отчестве и дальнейшем еще возвратили
18:42взгляд фоном барр и вот эти вот
18:44результаты которые возвращают 2 эти
18:46метода у нас формируется в отдельную
18:47строку через разделитель соответственно
18:49благодаря этому мы получаем вот такой
18:52список дальнейших уроках мы с вами более
18:53подробно рассмотрим десктопную
18:55разработку в том числе и на winforms а
18:57весь исходный код всех примеров которые
18:59мы сегодня рассматривали для патронов
19:01каналов с доступом к исходному коду
19:03будет доступен на обед реване и не
19:05забудьте поставь лайк если вам
19:06понравился данный урок он был для вас
19:08полезным и интересным если желание
19:09поддерживать меня канал финансово
19:11информацию том как это сделать найдете в
19:13описании буду рад если поделитесь
19:15уроком с друзьями ну и конечно если вы
19:17не подписаны на канал то обязательно
19:18подписывайтесь здесь уже есть и будет
19:20еще много полезных и интересных уроков
19:22для вас всем спасибо за внимание пока