C# на уроках информатики

Учимся общаться с компьютером

Разбить на страницы
Показывать лекцию целиком

Люди и компьютеры

Написание программ осложняется тем, что компьютер совсем не похож на людей и "воспитание" у нас разное. Если бы это было не так, то и компьютер, и мы одинаково бы воспринимали окружающий мир и умели бы говорить на одном языке. Тогда нам было бы легче понимать друг друга: достаточно попросить компьютер нарисовать кота — и все.

Вы скажете: "В чем же дело? Давайте научим компьютер понимать нас!". Но эти машины устроены совсем не так, как человеческий мозг, и "видят" мир иначе, поэтому обучить их мышлению, подобному нашему, — непростая задача.

Впрочем, выход есть: надо найти то, что поможет прийти к согласию:

  • общий "взгляд на мир" и
  • общий язык, который способны понимать как люди, так и компьютеры.
  • Эта часть курса полностью посвящена изучению способов общения с компьютером. Надо только "развернуть" свое сознание, чтобы увидеть вещи так, как будто вы находитесь в роли компьютера. При этом придется пойти на взаимные уступки: компьютер сможет научиться многому из того, что делаем мы (например, запомнит некоторые слова), но и вы должны будете уяснить некоторые особенности его мира. Попытайтесь забраться в "голову" компьютера и представить, как можно было бы изложить мысли.

    Компьютеры не могут догадываться о том, что мы думаем, чего от них хотим и каким образом они могут выполнить наши желания. Остается только мечтать про тот день, когда они будут откликаться на один лишь взгляд и движение бровей в их сторону, но сейчас приходится четко излагать свои идеи и даже давать компьютерам указания, которым они обязаны следовать. Короче говоря, взаимопонимания между людьми и машинами до сих пор нет, и если мы хотим добиться от них помощи, то придется преодолеть эту пропасть.

    Итак, давайте ненадолго забудем о компьютерах и представим, что вам крайне необходимо найти общий язык с неким пришельцем. А история такова…

  • К счастью или нет, но что-то произошло во Вселенной, и вы оказались на маленьком пустынном острове посреди океана один на один со странным существом. После отчаянного "Привет, меня зовут Света, а тебя?", вы, в конце концов, решаете дать своему спутнику имя – Алджи.
  • Подступивший голод дает о себе знать. По счастью на высокой пальме висят несколько кокосов, и Алджи мог бы достать их. Вот только как объяснить ему, что надо сделать? На песке вы рисуете изображение кокосовой пальмы и, указывая на него, произносите слово "ко-кос". Вас поражает, что Алджи моментально реагирует на этот рисунок, и отлично воспринимает ваши дальнейшие объяснения. Обнаруживается, что у этого создания талант к языкам. До наступления сумерек Алджи овладевает русским.
  • Волнуясь от осознания собственного успеха, вы решаетесь попросить: "Алджи, пожалуйста, подними меня на плечи, чтобы я могла достать кокосы!"

    Он смотрит на вас озадаченно. Затем с таким же видом переводит взгляд на изображение кокосовой пальмы. Потом опять на вас. И снова на рисунок. Бесполезно — он не понимает! Осознав свою ошибку, вы хватаетесь за голову и растерянно показываете на настоящую пальму. Но Алджи по-прежнему не может понять. Оказывается, он понимает только рисунки. Ага! Теперь-то становится ясно, что, хотя Алджи и может использовать ваш язык, он фактически НЕ понимает реальных вещей, о которых вы говорите.

  • Каким-то образом надо прийти к общей точке зрения. На первый взгляд, все просто: раз удалось научить языку, то можно обучить и правильному пониманию объектов реального мира. Но и через трое суток кокосы по-прежнему висят на пальме. Уроки оказываются бесполезными, и вы теряете контроль над ситуацией по мере того, как перестаете понимать, в чем же дело.

    Вы не знаете, сон это, галлюцинации или видение, но в ярком, туманном свете появляется фигура в белом. Низкий голос подсказывает: "Вот отличный способ восприятия окружающего мира! Только так вы и Знифф12 (вот оно – настоящее имя Алджи!) сможете понять друг друга". Неизвестно сколько времени проходит, пока образы магически проникают в ваш разум, обучая новому способу описания мира. Наконец, успокоившись, вы выбираетесь из этого состояния.

  • Встрепенувшись, хватаете Алджи за плечи: "Я все поняла, приятель, слушай внимательно то, что я тебе скажу". Алджи с нахмуренным видом вслушивается в вашу речь.
  • "В окружающем нас мире существуют различные классы объектов — растения, животные, голодные люди, инопланетяне и так далее".
  • "Сейчас я хотела бы рассказать тебе об объектах, существующих на этом острове. Прежде всего, если ты еще не заметил, меня очень интересует эта кокосовая пальма (между прочим, она входит в класс, называемый "растениями"). Мне интересен и вон тот слон. Ух, ты! Странно, что я не заметила его раньше". (Вы указываете на каждый объект, о котором говорите.)
  • "Слон входит в класс под названием "животные" и имеет некоторые важные для нас свойства. Во-первых, все животные могут двигаться. Во-вторых, слон очень тяжелый, наверное, тонны две – это нам пригодится. В-третьих, у него скверный характер, что тоже может оказаться полезным".
  • "Ну, а теперь, Алджи, слушай меня... В окружающем нас мире непрерывно происходят события. Я проголодалась — это событие. Кокосы созревают — и это событие. Иногда мы сами можем вызывать события, чтобы выполнить некоторое действие. У меня есть отличная мысль: давай вызовем событие "беспокойство слона", которое заставит его помочь нам выполнить действие "добывание кокосов".
  • "Разделим обязанности. Я вызову событие (привлеку к тебе внимание слона), а ты заставишь его достать для нас кокосы, договорились?" При этом Алджи робко смотрит на вас и признается: "Света, я слышу твои слова, но не понимаю, как это сделать". Похлопывая товарища по спине, вы говорите: "Не беспокойся, я никогда не стану просить тебя о чем-либо, сначала не объяснив тебе метода выполнения этого действия. Вот что нужно будет сделать после того, как я скажу: "Достань кокосы":
  • Выбеги из-за этого камня и встань рядом с пальмой. Слон немедленно понесется к тебе.
  • В тот момент, когда он достигнет нарисованной мной на песке линии, беги изо всех сил (поворачивать в разные стороны и бегать взад и вперед не надо).
  • Слон ударится о пальму и на некоторое время оцепенеет, но силой удара кокосы будут сбиты, и мы позже сможем собрать их.
  • После этого возвращайся назад и сообщи результат".
  • Алджи надолго замирает, переваривая задание, потом неожиданно достает суперсовершенное устройство связи, в течение некоторого времени издает звуки, напоминающие верещание модема, и затем снова кладет устройство в карман. Вы спрашиваете: "Что это было, Алджи?". Он отвечает: "Позволь мне перевести, Света...
  • Существует класс объектов, называемых Икс-знифферами.
  • Я один из объектов такого класса, но есть и другие.
  • Все объекты этого класса обладают следующими свойствами:
  • name ("имя", например, мое имя — Знифф12);
  • earShape ("формаУха", значение этого свойства — "трубка" — всегда постоянно);
  • likeToWatchTV ("люблюСмотретьТелевизор", в некоторых случаях это правда, а в других — нет).
  • Должен признаться, мое появление здесь не случайно. Ты попала в популярное ТВ-шоу "Остаться в живых", а минуту назад я позвонил своему продюсеру и сказал, что меня не удовлетворяет обещанная плата за такое опасное задание. Он собирается немедленно выполнить метод "ОтправитьСпасательнуюГруппу".
  • На этом история заканчивается. Смысл в том, что вам с Алджи удалось разработать общий способ описания мира: вы используете одни термины — класс, объект, метод, свойство — и одинаково понимаете их значение. Это, наряду с использованием единого языка, дает вам возможность общения.

    Теперь представим, что вам нужно объясниться с компьютером. Решение будет аналогичным рассказанной истории, и проблему можно решить путем согласования общего способа восприятия мира, который сможет обеспечивать взаимопонимание человека и машины.

    Классы и объекты в языке C#

    Подход с использованием "классов, объектов, свойств, событий и методов" (о нем и было рассказано в истории) не является единственно возможным. Это только один из способов, который поможет объяснить пришельцу, как устроен окружающий нас мир. Крайне важно договориться о том, что вы будете описывать его при помощи одинаковых образов. Такой взгляд на мир (кстати, он называется "объектно-ориентированным" подходом) стал очень популярным способом описания вещей, и фактически язык C# требует придерживаться именно его.

    Итак, изучение языка C# — это изучение способов описания вещей при помощи классов, объектов, событий, методов и т. д.

    Если вы хотите, чтобы компьютер выполнил определенные действия, то вам придется сделать следующее:

  • выучить язык C# и научиться описывать вещи с ориентацией на объекты;
  • установить на компьютере приложение C# и другие сопутствующие программы. Тогда компьютер сможет понимать язык C# и работать с объектами, описанными в соответствии с объектно-ориентированным подходом.
  • Вот и все: общее представление о мире и общий язык. Вскоре будете общаться с компьютером, как старые приятели.

    Теперь необходимо понять, что собой представляет ориентация на объекты с точки зрения программиста.

  • Окружающий нас мир можно разделить на различные классы вещей: например, "коты", "дома" или "деревья". Классы можно считать именованными категориями, позволяющими группировать сходные объекты. Надо найти такой способ описания классов, который позволял бы компьютеру оперировать с классами и выполнять действия с их объектами.
  • Каждый класс вещей включает нужные нам объекты. Например, к классу "кот" относится мой кот Пушок – он является объектом класса котов. Дом на углу моей улицы не что иное, как объект класса "дом", а дуб, видимый из окна спальни, – объект класса "дерево". Если есть определенный объект, с которым должен работать компьютер, то необходимо создать некоторое описание, представляющее такой объект.
  • Для объектов характерны различные свойства, которые помогают четко описать объекты. Их можно сравнить с прилагательными в русском языке. Например, моего большого упитанного Пушка можно описать такими свойствами, как рост, вес и т. д.
  • События — это некоторые особые состояния, в которые может попадать объект. В реальном мире события происходят вокруг нас непрерывно. Например, когда я глажу Пушка, для него наступает приятное событие, которое можно назвать "Нирвана". Если налетает сильный ветер, ломающий ветви уже упоминавшегося здесь дуба, то с деревом происходит событие под названием "Ураган". При возникновении события, как правило, выполняются определенные действия, влияющие на состояние объекта. Действия по обработке события выполняются не самим объектом, а другими объектами, которые могут получать сообщение о возникающих событиях. При работе с компьютерным приложением, где есть видимые объекты, например, компьютерные игры, событиями могут быть "нажатие на кнопку", "нажатие на определенную клавишу" или "щелчок кнопки мыши".
  • Объект может выполнять действия. Например, кот Пушок лижет свою шерсть — это действие. В компьютерном мире определенные действия выполняются, когда происходят интересные события, например, при нажатии на кнопку выполняется действие "рисуем кота".
  • Хотите верьте, хотите нет, но компьютер может не иметь представления о том, как надо рисовать кота. В этом случае необходимо дать описание, которое будет ему понятно, — метод рисования кота, это набор пошаговых инструкций, определяющих порядок выполнения конкретных действий.
  • В последующих разделах мы рассмотрим каждый аспект объектно-ориентированного программирования и приведем более детальное описание. Начинаем учиться программировать на языке C#.

    В окружающем нас мире можно выделить различные группы вещей. Назовем их классами.

    Вспомним, как создаются классы в школе. Детей определенного возраста или с определенными способностями объединяют в группу и называют ее классом. Такой подход позволяет уравнять их в правах: все будут изучать одни и те же предметы и сдавать одни и те же экзамены.

    Но это не означает, что все ученики класса одинаковы, у них всего лишь имеются некоторые общие особенности.

    Рассмотрим другой пример: в группе живых организмов можно выделить два класса — "растения" и "животные".

    Теперь попробуем научиться выражать свои мысли так, чтобы компьютер смог понять то, что мы пытаемся сказать.

    В C# описание класса для компьютера может иметь следующий вид:

    class Animal
    {
    }

    Из этого небольшого отрывка кода компьютер понимает следующее:

  • мы собираемся изучать класс объектов;
  • мы назвали этот класс Animal ;
  • описание этого класса будет расположено между фигурными скобками { … }.
  • Класс "Animal" имеет смысл определить в программе, выводящей на экран изображения животных или сохраняющей интересные факты о них. При решении других задач надо будет описывать другие классы, например, классы MyPhotoProgram или MyGradeCalculator. Нужно понимать, что классы объединяют не только те объекты, которые существуют в реальном мире. Они полезны и при работе с абстрактными объектами.

    Строительный блок: Классы
    Все программы на языке C# представляют собой описание множества классов. Компьютеру известно слово "class", которое должно быть написано строчными буквами, но имя класса может быть любым и содержать как прописные, так и строчные буквы, причем использование пробелов не допускается.
    class Animal
    {
    }

    Немного позже мы расскажем о том, что происходит внутри описания класса (между фигурными скобками). Но сначала рассмотрим объекты.

    Каждый класс описывает, как устроены объекты класса. В процессе работы с классом "Animal" могут появиться объекты этого класса:

  • кот Барсик, принадлежащий вашей тете;
  • безымянная корова, виденная вами всего один раз;
  • горилла по кличке Джереми;
  • другие объекты.
  • Создание объектов

    Вы уже знаете, как вести разговор с компьютером о классе животных. Возможно, в какой-то момент вам захочется поговорить и об объектах. Например, о том, что "есть одно существо в классе животных, которого зовут Барсиком".

    Это можно выразить следующим образом:

    Animal Barsik;

    Мы написали небольшой отрывок кода, и здесь нужно остановиться и подумать, иначе можно упустить главное. Компьютер понимает следующее: "Этот человек хочет поговорить об объекте в классе Animal и назвать его Barsik. Я не знаю, что такое Barsik, и мне все равно – пусть называет, как хочет".

    Теперь дополним приведенный выше код еще одним выражением:

    Barsik = new Animal();

    Может показаться странным, но нужно сделать именно так, потому что с точки зрения компьютера в этом есть смысл. Подумайте "как машина" и представьте себе следующее:

    (рис 2.11)
  • Первое выражение ( Animal Barsik ) предупреждает компьютер, что вскоре мы попросим его работать с объектом из класса Animal. Теперь у компьютера появляется возможность проверить свои знания об этом классе. Он просматривает всю программу и ищет нужное описание. Не найдя такого класса, он сообщит вам, что сделать ничего не сможет. Если же отыскать нужное описание удастся, компьютер продолжит выполнение программы, ожидая вашей дальнейшей просьбы совершить некоторое действие с объектом класса Animal по имени Barsik.
  • Второе выражение ( Barsik = new Animal(); ) напоминает компьютеру: "Помнишь объект Barsik? Теперь мне нужно выполнить с ним действие. Выдели немножко памяти в своей голове, где ты хранил бы данные об этом животном". Компьютер запоминает новый объект класса Animal и понимает, что это объект Barsik, упомянутый ранее. Изучив класс Animal, компьютер кое-что знает о Барсике и держит эту информацию наготове, понимая, что может получить от вас дополнительные сведения об этом объекте.
  • Теперь рассмотрим все три момента и представим себе, как компьютер "думает" о них.

    Заметьте, в первом блоке мы описываем класс объектов в общем, а в блоках 2 и 3 выделяем определенный объект в классе Animal.

    Примечание редактора. По-английски fiddlestick означает "смычок", а fiddlesticks — "вздор, чепуха". Но, как уже говорилось, имя может быть любым, в том числе и "чепушинка".
    Строительный блок: Объекты
    Объекты — это отдельные, четко обозначенные экземпляры некоторого класса. Класс дает общее описание объектов, указывает "на что они похожи".

    Рассмотрим процесс объявления и создания объектов класса.

    class Animal
    {
    }
    Если планируется работать с определенным объектом, необходимо заранее сообщить компьютеру, к какому классу он принадлежит, для того чтобы компьютер проверил свои знания о нужном нам классе. Поэтому сначала указываем имя класса, а затем даем имя объекту.

    Этот процесс называется "объявлением объекта". Затем необходимо попросить компьютер "создать экземпляр" класса.

    Animal percyThePorcupine;
    //ПерсиДикобраз
    На основе своих знаний о классе компьютер создаст реальный объект, с которым он сможет выполнять действия.

    В нашем примере объект percyThePorcupine становится экземпляром Animal, или можно сказать, что percyThePorcupine — это "объект" типа Animal. Но в любом случае нам уже точно известно, что мы говорим об определенном объекте класса Animal. Это называется "созданием объекта".

    percyThePorcupine = 
    new Animal();

    Теперь мы знаем, как рассказать об определенном объекте в классе, но поскольку класс, который мы рассматриваем, достаточно прост (можно сказать, он совсем пустой), то работать с ним неинтересно. Итак, в следующей лекции мы добавим к нему некоторые элементы.

    Свойства объектов

    Если бы я попросил вас перечислить несколько свойств животных, то список мог быть следующим:

  • Вид животного (Kind of animal).
  • Рост (Height).
  • Длина (Length).
  • Количество лап (Number of legs).
  • Окрас (Color).
  • Наличие хвоста (Has a tail).
  • Является ли млекопитающим (Is a mammal).
  • При рассмотрении свойств этих животных вы можете присвоить значения каждому из них:

  • Kind of animal = "Cat" ("Кот").
  • Height = 50 cm (большой котяра!).
  • Length = 110 cm (это рысь скорее, а не домашняя кошка!).
  • Number of legs = 4.
  • Color = "Black" (черный).
  • Has tail = true (истина).
  • Is mammal = true (истина).
  • В C# эти свойства называются полями. (Слово "свойства" используется для несколько иной цели, но здесь мы не станем вдаваться в подробности.)

    Теперь рассмотрим нечто, о чем в реальной жизни беспокоиться не приходится, но в мире компьютеров оказывается очень важным. Обратите внимание: все указанные выше свойства кажутся однородными, однако фактически существуют разные типы полей. Приведем несколько примеров.

  • Значения полей height, Length и number of legs являются числами. Как правило, компьютер использует эти значения для выполнения математических операций.
  • В задаче с бананами поля можно было бы назвать так: numberOfBananas ("количествоБананов"), numberOfPeople ("количествоЛюдей") и numberEachOneGets ("количествоПолучаемоеКаждым"). Они должны иметь числовой тип, поскольку с их помощью мы выполняем некие математические вычисления.

    Примечание. В языке C# имена полей не могут содержать пробелы. Используйте в именах только буквы и числа, причем первой всегда ставится буква.

  • Поля Надо отметить, что в строковом поле (в строке) текст может содержать числа. Например, в тексте "Сегодня это уже 17-й крокодил, которого я вижу!" присутствуют буквы, пробелы, числа и знаки препинания, но с числами, находящимися в строке, нельзя выполнять математические операции.
  • Поле типа
  • Каждый "тип" обрабатывается компьютером особым образом, поэтому при определении полей мы должны указывать их тип. В одной программе мы определим поле numberOfLegs как строку, поскольку мы не планируем выполнять математические операции над этим полем, а в другом случае, когда надо будет узнать, сколько конечностей у 500 одинаковых объектов, может потребоваться использование такого поля в качестве числового.

    Тип "String" (строка)

    Для того чтобы попросить компьютер рассматривать некое свойство как строку, состоящую из букв, достаточно просто объявить объект следующим образом:

    string kindOfAnimal;

    Пока мы не задаем значение в этом поле, а всего лишь сообщаем, с каким типом данных будем работать, и присваиваем полю имя. Поставьте себя на место компьютера и представьте, как бы вы отреагировали, если бы человек написал для вас следующее:

    Числовые типы

    Извещая компьютер о том, что значение поля нужно рассматривать как число, необходимо выбрать один из нескольких числовых типов, известных в языке C#. Наиболее распространенный — integer. Из курса математики вы должны знать, что это не что иное, как целое число, которое может быть отрицательным, положительным или нулем.

    То, что значение поля должно быть целым числом, проще всего сообщается так:

    int numberOfLegs;

    А вот что подумает в этом случае наш цифровой друг:

    Тип "Boolean" (логическое значение)

    Если вам известно, что некоторое поле будет всегда принимать значения "true" ("истина") или "false" ("ложь") и ничего другого, то использование в C# поля типа "true/false" может оказаться полезным. Это самый простой из всех типов, хотя такие поля носят довольно странное название — булевые (Boolean), по имени математика Джорджа Буля.

    Извещая компьютер о том, что поле "hasTail" должно принимать значения "true/false", используйте следующий код:

    bool hasTail;

    Машина будет думать следующим образом:

    Итак, поля представляют собой элементы информации, позволяющие лучше описать объекты в классе. Они всегда имеют определенный тип.

    Добавление полей в класс

    Ранее, когда мы знакомили компьютер с классом животных, то просто дали классу название – Animal, добавили в код фигурные скобки и пообещали рассказать о нем больше, а точнее — сообщить о том, что находится внутри него. Запись выглядела так:

    class Animal
    {
    ...
    }

    А теперь мы готовы добавить несколько полей в определение класса.

    class Animal
    {
        string kindOfAnimal;
        string name;
        int numberOfLegs;
        int height;
        int length;
        string color;
        bool hasTail;
        bool isMammal;
        bool spellingCorrect;
    }

    Код должен быть аккуратным и легко читаемым, для чего и создаются отступы полей, показанные выше. Это делается при помощи клавиши TAB на клавиатуре – для одной строки или, выделив сразу несколько строк, для всех сразу.

    Поля и объекты

    Итак, мы объяснили компьютеру, что ВСЕ объекты класса Animal имеют перечисленные выше поля. Теперь давайте попросим его создать экземпляр, представляющий определенный объект класса Animal (как мы делали это в предыдущем разделе), и сообщим компьютеру некоторую информацию об этом объекте, присвоив значения каждому полю.

    Animal Barsik;
    Barsik = new Animal();
    Barsik.kindOfAnimal = "Cat";
    Barsik.name = "Кот Барсик";
    Barsik.numberOfLegs = 4;
    Barsik.height = 50;
    Barsik.length = 110;
    Barsik.color = "Black";
    Barsik.hasTail = true;
    Barsik.isMammal = true;

    Обратите внимание, что в кавычки ("") заключается значение только строковых полей. В конце каждого выражения ставится точка с запятой (;), после чего полученная конструкция становится оператором присваивания.

    На данном этапе стоит упомянуть, что выбранное нами имя объекта Barsik не имеет никакого значения для компьютера, который будет работать с объектом, даже если мы заменим имя Barsik на X или любое другое:

    Animal X;
    X = new Animal();
    X.kindOfAnimal = "Cat";
    X.height = 50;
    X.length = 110;
    X.color = "Black";
    X.hasTail = true;
    X.isMammal = true;
    Примечание редактора. То, что компьютер способен обрабатывать любые имена (проблемы не составит даже кот, которого зовут ГЩ12я), не означает, что объекты можно именовать как попало. Имя многое говорит человеку, поэтому крайне важно давать объектам содержательные имена, позволяющие лучше понимать смысл программы.

    Еще одно важное замечание. Каждый объект можно рассматривать как коробочку, внутри которой находятся ящички (поля). У двух объектов одного класса коробочки одинаковые, но значения, хранящиеся в ящичках (полях), — разные. Например, два объекта Миша и Гриша имеют поле "Рост", но Миша высокий, а Гриша маленького роста.

    Строительный блок: Поля
    Обычно в классе присутствует одно поле или несколько полей, которые позволяют описывать определенные черты объектов этого класса.
    class SchoolKid
    {
    string firstName;
    string lastName;
    int age;
    bool isWideAvake;
    }

    Поля всегда имеют определенный тип. Допустимых типов очень много, вот описание наиболее распространенных из них:

    Тип Описание Примеры значений
    string Строковый тип данных предполагает, что значением поля может быть слово или предложение, состоящее из символов алфавита, цифр, знаков препинания и т.д. "Petr" ("Петя")

    "Eight-legged Octopus" ("Восьминогий Осьминог")

    "Girls are too clever to fall out of their prams" ("Девочки слишком умные, чтобы выпасть из коляски")

    int Числовой тип данных предполагает, что значение поля может быть целым числом.

    Название типа – это сокращение от слова "integer"

    328

    28000

    -520

    bool Логический тип данных предполагает, что значение поля может быть либо истиной (true), либо ложью (false). Название типа – сокращение от слова "boolean". True — истина

    False — ложь

    При определении поля в программе необходимо указать его тип и имя:

    string lastname;

    Обозначение типа должно быть известно компьютеру. Указанные выше основные типы пишутся строчными буквами, однако некоторые могут содержать и прописные буквы.

    Давая имя полю, можно использовать любое слово, например, VsegdaNacheku – здесь сочетаются заглавные и строчные буквы. Обратите внимание: пробелы ставить нельзя.

    При работе с определенным объектом полям присваиваются значения, которые помогают описывать объект. Если, например, у нас есть объект с именем schoolKid (Школьник), то его полям можно было бы присвоить следующие значения:

    schoolKid.firstName = "Petr";
    schoolKid.age = 13;

    Имя объекта и имя поля разделяются точкой (.).

    Итак, schoolKid.firstName = "Petr" означает следующее: " Petr становится значением поля firstName ( Имя ) объекта schoolKid ".

    Закрытые, защищенные и открытые поля

    На первом этапе изучения языка C# этот раздел не столь важен, но в дальнейшем вам могут встречаться слова private, protected и public. Давайте обсудим их смысл.

    class Animal
    {
        string kindOfAnimal;
        string name;
        int numberOfLegs;
        int height;
        int length;
        string color;
        bool hasTail;
        bool isMammal;
        bool spellingCorrect;
    }
    class MyTestClass
    {
        Animal myAnimal;
    }

    Объекты одного класса могут быть полями в другом классе. Например, в классе MyTestClass появится поле myAnimal, принадлежащее классу Animal.

    При объявлении полей так, как показано выше, мы можем решить, должны ли другие классы иметь к ним доступ. Иногда очень важно делать поля закрытыми ( private ) — для того, например, чтобы другой класс не помещал неверные значения в поля и не нарушал работу программы. Использование полей private, protected и public определяет степень защиты объектов класса.

    На рисунке изображены дети, живущие в одной семье. Обратите внимание на то, как обеспечивается безопасность каждого из них. Малютка Света закрыта ( private ) в комнате — ее не выпускают из дома, и она имеет наиболее высокий уровень защиты. С ней могут общаться люди, обладающие наибольшим доверием. Борису разрешается находиться как на переднем, так и на заднем дворе, но он по-прежнему в некоторой степени защищен ( protected ). Толя, старший ребенок, является открытым ( public ) для других, и любой желающий может общаться с ним.

    Итак, в начало описания поля мы можем добавить еще одно слово:

    class Animal
    {
        public string kindOfAnimal;
        public string name;
        public int numberOfLegs;
        public int height;
        public int length;
        public string color;
        bool hasTail;
        protected bool isMammal;
        private bool spellingCorrect;
    }

    Вы можете поинтересоваться: а что произойдет, если мы не станем включать эти слова? В таком случае по умолчанию задается значение private и компьютер воспринимает код, как если бы в начале объявления было написано слово private. Поэтому в последнем примере поле hasTail автоматически становится закрытым ( private ).

    Давайте уточним значения этих слов:

  • Private – "объекты только этого класса могут обращаться к данному полю".
  • Public – "объекты любого класса могут обращаться к этому полю".
  • Protected – "только объекты классов-наследников могут обращаться к полю". Если построен класс Animal, то другой класс, например, класс Mammal (Млекопитающее), может объявить себя наследником класса Animal.
  • Следующие примеры двух классов демонстрируют описанный принцип полей public и private. Поля типа protected мы оставим без обсуждения, а сведения о них можно найти в справке Visual C# Express.

    Как и ранее, сначала мы определяем несколько закрытых и открытых полей в классе Animal и затем пытаемся обратиться к ним из класса Zoo.

    class Animal
    {
        public string kindOfAnimal;
        public string name;
        public int numberOfLegs;
        public int height;
        public int length;
        public string color;
        bool hasTail;
        protected bool isMammal;
        private bool spellingCorrect;
    }
    class Zoo
    {
        Animal a = new Animal ();
            // Следующая строка будет выполнена успешно, поскольку классу "Zoo"
            // разрешено обращаться к открытым полям в классе "Animal"
        a.kindOfAnimal = "Kangaroo";
            // Обе следующие строки НЕ будут выполнены, поскольку классу "Zoo"
            // не разрешено обращаться к закрытым или защищенным полям
        a.isMammal = false; // Попытка обращения к защищенному методу
        a.spellingCorrect = true; // Попытка обращения к закрытому свойству класса
    }
    Страницы:

    Люди и компьютеры

    Написание программ осложняется тем, что компьютер совсем не похож на людей и "воспитание" у нас разное. Если бы это было не так, то и компьютер, и мы одинаково бы воспринимали окружающий мир и умели бы говорить на одном языке. Тогда нам было бы легче понимать друг друга: достаточно попросить компьютер нарисовать кота — и все.

    Вы скажете: "В чем же дело? Давайте научим компьютер понимать нас!". Но эти машины устроены совсем не так, как человеческий мозг, и "видят" мир иначе, поэтому обучить их мышлению, подобному нашему, — непростая задача.

    Впрочем, выход есть: надо найти то, что поможет прийти к согласию:

  • общий "взгляд на мир" и
  • общий язык, который способны понимать как люди, так и компьютеры.
  • Эта часть курса полностью посвящена изучению способов общения с компьютером. Надо только "развернуть" свое сознание, чтобы увидеть вещи так, как будто вы находитесь в роли компьютера. При этом придется пойти на взаимные уступки: компьютер сможет научиться многому из того, что делаем мы (например, запомнит некоторые слова), но и вы должны будете уяснить некоторые особенности его мира. Попытайтесь забраться в "голову" компьютера и представить, как можно было бы изложить мысли.

    Компьютеры не могут догадываться о том, что мы думаем, чего от них хотим и каким образом они могут выполнить наши желания. Остается только мечтать про тот день, когда они будут откликаться на один лишь взгляд и движение бровей в их сторону, но сейчас приходится четко излагать свои идеи и даже давать компьютерам указания, которым они обязаны следовать. Короче говоря, взаимопонимания между людьми и машинами до сих пор нет, и если мы хотим добиться от них помощи, то придется преодолеть эту пропасть.

    Итак, давайте ненадолго забудем о компьютерах и представим, что вам крайне необходимо найти общий язык с неким пришельцем. А история такова…

  • К счастью или нет, но что-то произошло во Вселенной, и вы оказались на маленьком пустынном острове посреди океана один на один со странным существом. После отчаянного "Привет, меня зовут Света, а тебя?", вы, в конце концов, решаете дать своему спутнику имя – Алджи.
  • Подступивший голод дает о себе знать. По счастью на высокой пальме висят несколько кокосов, и Алджи мог бы достать их. Вот только как объяснить ему, что надо сделать? На песке вы рисуете изображение кокосовой пальмы и, указывая на него, произносите слово "ко-кос". Вас поражает, что Алджи моментально реагирует на этот рисунок, и отлично воспринимает ваши дальнейшие объяснения. Обнаруживается, что у этого создания талант к языкам. До наступления сумерек Алджи овладевает русским.
  • Волнуясь от осознания собственного успеха, вы решаетесь попросить: "Алджи, пожалуйста, подними меня на плечи, чтобы я могла достать кокосы!"

    Он смотрит на вас озадаченно. Затем с таким же видом переводит взгляд на изображение кокосовой пальмы. Потом опять на вас. И снова на рисунок. Бесполезно — он не понимает! Осознав свою ошибку, вы хватаетесь за голову и растерянно показываете на настоящую пальму. Но Алджи по-прежнему не может понять. Оказывается, он понимает только рисунки. Ага! Теперь-то становится ясно, что, хотя Алджи и может использовать ваш язык, он фактически НЕ понимает реальных вещей, о которых вы говорите.

  • Каким-то образом надо прийти к общей точке зрения. На первый взгляд, все просто: раз удалось научить языку, то можно обучить и правильному пониманию объектов реального мира. Но и через трое суток кокосы по-прежнему висят на пальме. Уроки оказываются бесполезными, и вы теряете контроль над ситуацией по мере того, как перестаете понимать, в чем же дело.

    Вы не знаете, сон это, галлюцинации или видение, но в ярком, туманном свете появляется фигура в белом. Низкий голос подсказывает: "Вот отличный способ восприятия окружающего мира! Только так вы и Знифф12 (вот оно – настоящее имя Алджи!) сможете понять друг друга". Неизвестно сколько времени проходит, пока образы магически проникают в ваш разум, обучая новому способу описания мира. Наконец, успокоившись, вы выбираетесь из этого состояния.

  • Встрепенувшись, хватаете Алджи за плечи: "Я все поняла, приятель, слушай внимательно то, что я тебе скажу". Алджи с нахмуренным видом вслушивается в вашу речь.
  • "В окружающем нас мире существуют различные классы объектов — растения, животные, голодные люди, инопланетяне и так далее".
  • "Сейчас я хотела бы рассказать тебе об объектах, существующих на этом острове. Прежде всего, если ты еще не заметил, меня очень интересует эта кокосовая пальма (между прочим, она входит в класс, называемый "растениями"). Мне интересен и вон тот слон. Ух, ты! Странно, что я не заметила его раньше". (Вы указываете на каждый объект, о котором говорите.)
  • "Слон входит в класс под названием "животные" и имеет некоторые важные для нас свойства. Во-первых, все животные могут двигаться. Во-вторых, слон очень тяжелый, наверное, тонны две – это нам пригодится. В-третьих, у него скверный характер, что тоже может оказаться полезным".
  • "Ну, а теперь, Алджи, слушай меня... В окружающем нас мире непрерывно происходят события. Я проголодалась — это событие. Кокосы созревают — и это событие. Иногда мы сами можем вызывать события, чтобы выполнить некоторое действие. У меня есть отличная мысль: давай вызовем событие "беспокойство слона", которое заставит его помочь нам выполнить действие "добывание кокосов".
  • "Разделим обязанности. Я вызову событие (привлеку к тебе внимание слона), а ты заставишь его достать для нас кокосы, договорились?" При этом Алджи робко смотрит на вас и признается: "Света, я слышу твои слова, но не понимаю, как это сделать". Похлопывая товарища по спине, вы говорите: "Не беспокойся, я никогда не стану просить тебя о чем-либо, сначала не объяснив тебе метода выполнения этого действия. Вот что нужно будет сделать после того, как я скажу: "Достань кокосы":
  • Выбеги из-за этого камня и встань рядом с пальмой. Слон немедленно понесется к тебе.
  • В тот момент, когда он достигнет нарисованной мной на песке линии, беги изо всех сил (поворачивать в разные стороны и бегать взад и вперед не надо).
  • Слон ударится о пальму и на некоторое время оцепенеет, но силой удара кокосы будут сбиты, и мы позже сможем собрать их.
  • После этого возвращайся назад и сообщи результат".
  • Алджи надолго замирает, переваривая задание, потом неожиданно достает суперсовершенное устройство связи, в течение некоторого времени издает звуки, напоминающие верещание модема, и затем снова кладет устройство в карман. Вы спрашиваете: "Что это было, Алджи?". Он отвечает: "Позволь мне перевести, Света...
  • Существует класс объектов, называемых Икс-знифферами.
  • Я один из объектов такого класса, но есть и другие.
  • Все объекты этого класса обладают следующими свойствами:
  • name ("имя", например, мое имя — Знифф12);
  • earShape ("формаУха", значение этого свойства — "трубка" — всегда постоянно);
  • likeToWatchTV ("люблюСмотретьТелевизор", в некоторых случаях это правда, а в других — нет).
  • Должен признаться, мое появление здесь не случайно. Ты попала в популярное ТВ-шоу "Остаться в живых", а минуту назад я позвонил своему продюсеру и сказал, что меня не удовлетворяет обещанная плата за такое опасное задание. Он собирается немедленно выполнить метод "ОтправитьСпасательнуюГруппу".
  • На этом история заканчивается. Смысл в том, что вам с Алджи удалось разработать общий способ описания мира: вы используете одни термины — класс, объект, метод, свойство — и одинаково понимаете их значение. Это, наряду с использованием единого языка, дает вам возможность общения.

    Теперь представим, что вам нужно объясниться с компьютером. Решение будет аналогичным рассказанной истории, и проблему можно решить путем согласования общего способа восприятия мира, который сможет обеспечивать взаимопонимание человека и машины.

    Классы и объекты в языке C#

    Подход с использованием "классов, объектов, свойств, событий и методов" (о нем и было рассказано в истории) не является единственно возможным. Это только один из способов, который поможет объяснить пришельцу, как устроен окружающий нас мир. Крайне важно договориться о том, что вы будете описывать его при помощи одинаковых образов. Такой взгляд на мир (кстати, он называется "объектно-ориентированным" подходом) стал очень популярным способом описания вещей, и фактически язык C# требует придерживаться именно его.

    Итак, изучение языка C# — это изучение способов описания вещей при помощи классов, объектов, событий, методов и т. д.

    Если вы хотите, чтобы компьютер выполнил определенные действия, то вам придется сделать следующее:

  • выучить язык C# и научиться описывать вещи с ориентацией на объекты;
  • установить на компьютере приложение C# и другие сопутствующие программы. Тогда компьютер сможет понимать язык C# и работать с объектами, описанными в соответствии с объектно-ориентированным подходом.
  • Вот и все: общее представление о мире и общий язык. Вскоре будете общаться с компьютером, как старые приятели.

    Теперь необходимо понять, что собой представляет ориентация на объекты с точки зрения программиста.

  • Окружающий нас мир можно разделить на различные классы вещей: например, "коты", "дома" или "деревья". Классы можно считать именованными категориями, позволяющими группировать сходные объекты. Надо найти такой способ описания классов, который позволял бы компьютеру оперировать с классами и выполнять действия с их объектами.
  • Каждый класс вещей включает нужные нам объекты. Например, к классу "кот" относится мой кот Пушок – он является объектом класса котов. Дом на углу моей улицы не что иное, как объект класса "дом", а дуб, видимый из окна спальни, – объект класса "дерево". Если есть определенный объект, с которым должен работать компьютер, то необходимо создать некоторое описание, представляющее такой объект.
  • Для объектов характерны различные свойства, которые помогают четко описать объекты. Их можно сравнить с прилагательными в русском языке. Например, моего большого упитанного Пушка можно описать такими свойствами, как рост, вес и т. д.
  • События — это некоторые особые состояния, в которые может попадать объект. В реальном мире события происходят вокруг нас непрерывно. Например, когда я глажу Пушка, для него наступает приятное событие, которое можно назвать "Нирвана". Если налетает сильный ветер, ломающий ветви уже упоминавшегося здесь дуба, то с деревом происходит событие под названием "Ураган". При возникновении события, как правило, выполняются определенные действия, влияющие на состояние объекта. Действия по обработке события выполняются не самим объектом, а другими объектами, которые могут получать сообщение о возникающих событиях. При работе с компьютерным приложением, где есть видимые объекты, например, компьютерные игры, событиями могут быть "нажатие на кнопку", "нажатие на определенную клавишу" или "щелчок кнопки мыши".
  • Объект может выполнять действия. Например, кот Пушок лижет свою шерсть — это действие. В компьютерном мире определенные действия выполняются, когда происходят интересные события, например, при нажатии на кнопку выполняется действие "рисуем кота".
  • Хотите верьте, хотите нет, но компьютер может не иметь представления о том, как надо рисовать кота. В этом случае необходимо дать описание, которое будет ему понятно, — метод рисования кота, это набор пошаговых инструкций, определяющих порядок выполнения конкретных действий.
  • В последующих разделах мы рассмотрим каждый аспект объектно-ориентированного программирования и приведем более детальное описание. Начинаем учиться программировать на языке C#.

    В окружающем нас мире можно выделить различные группы вещей. Назовем их классами.

    Вспомним, как создаются классы в школе. Детей определенного возраста или с определенными способностями объединяют в группу и называют ее классом. Такой подход позволяет уравнять их в правах: все будут изучать одни и те же предметы и сдавать одни и те же экзамены.

    Но это не означает, что все ученики класса одинаковы, у них всего лишь имеются некоторые общие особенности.

    Рассмотрим другой пример: в группе живых организмов можно выделить два класса — "растения" и "животные".

    Теперь попробуем научиться выражать свои мысли так, чтобы компьютер смог понять то, что мы пытаемся сказать.

    В C# описание класса для компьютера может иметь следующий вид:

    class Animal
    {
    }

    Из этого небольшого отрывка кода компьютер понимает следующее:

  • мы собираемся изучать класс объектов;
  • мы назвали этот класс Animal ;
  • описание этого класса будет расположено между фигурными скобками { … }.
  • Класс "Animal" имеет смысл определить в программе, выводящей на экран изображения животных или сохраняющей интересные факты о них. При решении других задач надо будет описывать другие классы, например, классы MyPhotoProgram или MyGradeCalculator. Нужно понимать, что классы объединяют не только те объекты, которые существуют в реальном мире. Они полезны и при работе с абстрактными объектами.

    Строительный блок: Классы
    Все программы на языке C# представляют собой описание множества классов. Компьютеру известно слово "class", которое должно быть написано строчными буквами, но имя класса может быть любым и содержать как прописные, так и строчные буквы, причем использование пробелов не допускается.
    class Animal
    {
    }

    Немного позже мы расскажем о том, что происходит внутри описания класса (между фигурными скобками). Но сначала рассмотрим объекты.

    Каждый класс описывает, как устроены объекты класса. В процессе работы с классом "Animal" могут появиться объекты этого класса:

  • кот Барсик, принадлежащий вашей тете;
  • безымянная корова, виденная вами всего один раз;
  • горилла по кличке Джереми;
  • другие объекты.
  • Создание объектов

    Вы уже знаете, как вести разговор с компьютером о классе животных. Возможно, в какой-то момент вам захочется поговорить и об объектах. Например, о том, что "есть одно существо в классе животных, которого зовут Барсиком".

    Это можно выразить следующим образом:

    Animal Barsik;

    Мы написали небольшой отрывок кода, и здесь нужно остановиться и подумать, иначе можно упустить главное. Компьютер понимает следующее: "Этот человек хочет поговорить об объекте в классе Animal и назвать его Barsik. Я не знаю, что такое Barsik, и мне все равно – пусть называет, как хочет".

    Теперь дополним приведенный выше код еще одним выражением:

    Barsik = new Animal();

    Может показаться странным, но нужно сделать именно так, потому что с точки зрения компьютера в этом есть смысл. Подумайте "как машина" и представьте себе следующее:

    (рис 2.11)
  • Первое выражение ( Animal Barsik ) предупреждает компьютер, что вскоре мы попросим его работать с объектом из класса Animal. Теперь у компьютера появляется возможность проверить свои знания об этом классе. Он просматривает всю программу и ищет нужное описание. Не найдя такого класса, он сообщит вам, что сделать ничего не сможет. Если же отыскать нужное описание удастся, компьютер продолжит выполнение программы, ожидая вашей дальнейшей просьбы совершить некоторое действие с объектом класса Animal по имени Barsik.
  • Второе выражение ( Barsik = new Animal(); ) напоминает компьютеру: "Помнишь объект Barsik? Теперь мне нужно выполнить с ним действие. Выдели немножко памяти в своей голове, где ты хранил бы данные об этом животном". Компьютер запоминает новый объект класса Animal и понимает, что это объект Barsik, упомянутый ранее. Изучив класс Animal, компьютер кое-что знает о Барсике и держит эту информацию наготове, понимая, что может получить от вас дополнительные сведения об этом объекте.
  • Теперь рассмотрим все три момента и представим себе, как компьютер "думает" о них.

    Заметьте, в первом блоке мы описываем класс объектов в общем, а в блоках 2 и 3 выделяем определенный объект в классе Animal.

    Примечание редактора. По-английски fiddlestick означает "смычок", а fiddlesticks — "вздор, чепуха". Но, как уже говорилось, имя может быть любым, в том числе и "чепушинка".
    Строительный блок: Объекты
    Объекты — это отдельные, четко обозначенные экземпляры некоторого класса. Класс дает общее описание объектов, указывает "на что они похожи".

    Рассмотрим процесс объявления и создания объектов класса.

    class Animal
    {
    }
    Если планируется работать с определенным объектом, необходимо заранее сообщить компьютеру, к какому классу он принадлежит, для того чтобы компьютер проверил свои знания о нужном нам классе. Поэтому сначала указываем имя класса, а затем даем имя объекту.

    Этот процесс называется "объявлением объекта". Затем необходимо попросить компьютер "создать экземпляр" класса.

    Animal percyThePorcupine;
    //ПерсиДикобраз
    На основе своих знаний о классе компьютер создаст реальный объект, с которым он сможет выполнять действия.

    В нашем примере объект percyThePorcupine становится экземпляром Animal, или можно сказать, что percyThePorcupine — это "объект" типа Animal. Но в любом случае нам уже точно известно, что мы говорим об определенном объекте класса Animal. Это называется "созданием объекта".

    percyThePorcupine = 
    new Animal();

    Теперь мы знаем, как рассказать об определенном объекте в классе, но поскольку класс, который мы рассматриваем, достаточно прост (можно сказать, он совсем пустой), то работать с ним неинтересно. Итак, в следующей лекции мы добавим к нему некоторые элементы.

    Свойства объектов

    Если бы я попросил вас перечислить несколько свойств животных, то список мог быть следующим:

  • Вид животного (Kind of animal).
  • Рост (Height).
  • Длина (Length).
  • Количество лап (Number of legs).
  • Окрас (Color).
  • Наличие хвоста (Has a tail).
  • Является ли млекопитающим (Is a mammal).
  • При рассмотрении свойств этих животных вы можете присвоить значения каждому из них:

  • Kind of animal = "Cat" ("Кот").
  • Height = 50 cm (большой котяра!).
  • Length = 110 cm (это рысь скорее, а не домашняя кошка!).
  • Number of legs = 4.
  • Color = "Black" (черный).
  • Has tail = true (истина).
  • Is mammal = true (истина).
  • В C# эти свойства называются полями. (Слово "свойства" используется для несколько иной цели, но здесь мы не станем вдаваться в подробности.)

    Теперь рассмотрим нечто, о чем в реальной жизни беспокоиться не приходится, но в мире компьютеров оказывается очень важным. Обратите внимание: все указанные выше свойства кажутся однородными, однако фактически существуют разные типы полей. Приведем несколько примеров.

  • Значения полей height, Length и number of legs являются числами. Как правило, компьютер использует эти значения для выполнения математических операций.
  • В задаче с бананами поля можно было бы назвать так: numberOfBananas ("количествоБананов"), numberOfPeople ("количествоЛюдей") и numberEachOneGets ("количествоПолучаемоеКаждым"). Они должны иметь числовой тип, поскольку с их помощью мы выполняем некие математические вычисления.

    Примечание. В языке C# имена полей не могут содержать пробелы. Используйте в именах только буквы и числа, причем первой всегда ставится буква.

  • Поля Надо отметить, что в строковом поле (в строке) текст может содержать числа. Например, в тексте "Сегодня это уже 17-й крокодил, которого я вижу!" присутствуют буквы, пробелы, числа и знаки препинания, но с числами, находящимися в строке, нельзя выполнять математические операции.
  • Поле типа
  • Каждый "тип" обрабатывается компьютером особым образом, поэтому при определении полей мы должны указывать их тип. В одной программе мы определим поле numberOfLegs как строку, поскольку мы не планируем выполнять математические операции над этим полем, а в другом случае, когда надо будет узнать, сколько конечностей у 500 одинаковых объектов, может потребоваться использование такого поля в качестве числового.

    Тип "String" (строка)

    Для того чтобы попросить компьютер рассматривать некое свойство как строку, состоящую из букв, достаточно просто объявить объект следующим образом:

    string kindOfAnimal;

    Пока мы не задаем значение в этом поле, а всего лишь сообщаем, с каким типом данных будем работать, и присваиваем полю имя. Поставьте себя на место компьютера и представьте, как бы вы отреагировали, если бы человек написал для вас следующее:

    Числовые типы

    Извещая компьютер о том, что значение поля нужно рассматривать как число, необходимо выбрать один из нескольких числовых типов, известных в языке C#. Наиболее распространенный — integer. Из курса математики вы должны знать, что это не что иное, как целое число, которое может быть отрицательным, положительным или нулем.

    То, что значение поля должно быть целым числом, проще всего сообщается так:

    int numberOfLegs;

    А вот что подумает в этом случае наш цифровой друг:

    Тип "Boolean" (логическое значение)

    Если вам известно, что некоторое поле будет всегда принимать значения "true" ("истина") или "false" ("ложь") и ничего другого, то использование в C# поля типа "true/false" может оказаться полезным. Это самый простой из всех типов, хотя такие поля носят довольно странное название — булевые (Boolean), по имени математика Джорджа Буля.

    Извещая компьютер о том, что поле "hasTail" должно принимать значения "true/false", используйте следующий код:

    bool hasTail;

    Машина будет думать следующим образом:

    Итак, поля представляют собой элементы информации, позволяющие лучше описать объекты в классе. Они всегда имеют определенный тип.

    Добавление полей в класс

    Ранее, когда мы знакомили компьютер с классом животных, то просто дали классу название – Animal, добавили в код фигурные скобки и пообещали рассказать о нем больше, а точнее — сообщить о том, что находится внутри него. Запись выглядела так:

    class Animal
    {
    ...
    }

    А теперь мы готовы добавить несколько полей в определение класса.

    class Animal
    {
        string kindOfAnimal;
        string name;
        int numberOfLegs;
        int height;
        int length;
        string color;
        bool hasTail;
        bool isMammal;
        bool spellingCorrect;
    }

    Код должен быть аккуратным и легко читаемым, для чего и создаются отступы полей, показанные выше. Это делается при помощи клавиши TAB на клавиатуре – для одной строки или, выделив сразу несколько строк, для всех сразу.

    Поля и объекты

    Итак, мы объяснили компьютеру, что ВСЕ объекты класса Animal имеют перечисленные выше поля. Теперь давайте попросим его создать экземпляр, представляющий определенный объект класса Animal (как мы делали это в предыдущем разделе), и сообщим компьютеру некоторую информацию об этом объекте, присвоив значения каждому полю.

    Animal Barsik;
    Barsik = new Animal();
    Barsik.kindOfAnimal = "Cat";
    Barsik.name = "Кот Барсик";
    Barsik.numberOfLegs = 4;
    Barsik.height = 50;
    Barsik.length = 110;
    Barsik.color = "Black";
    Barsik.hasTail = true;
    Barsik.isMammal = true;

    Обратите внимание, что в кавычки ("") заключается значение только строковых полей. В конце каждого выражения ставится точка с запятой (;), после чего полученная конструкция становится оператором присваивания.

    На данном этапе стоит упомянуть, что выбранное нами имя объекта Barsik не имеет никакого значения для компьютера, который будет работать с объектом, даже если мы заменим имя Barsik на X или любое другое:

    Animal X;
    X = new Animal();
    X.kindOfAnimal = "Cat";
    X.height = 50;
    X.length = 110;
    X.color = "Black";
    X.hasTail = true;
    X.isMammal = true;
    Примечание редактора. То, что компьютер способен обрабатывать любые имена (проблемы не составит даже кот, которого зовут ГЩ12я), не означает, что объекты можно именовать как попало. Имя многое говорит человеку, поэтому крайне важно давать объектам содержательные имена, позволяющие лучше понимать смысл программы.

    Еще одно важное замечание. Каждый объект можно рассматривать как коробочку, внутри которой находятся ящички (поля). У двух объектов одного класса коробочки одинаковые, но значения, хранящиеся в ящичках (полях), — разные. Например, два объекта Миша и Гриша имеют поле "Рост", но Миша высокий, а Гриша маленького роста.

    Строительный блок: Поля
    Обычно в классе присутствует одно поле или несколько полей, которые позволяют описывать определенные черты объектов этого класса.
    class SchoolKid
    {
    string firstName;
    string lastName;
    int age;
    bool isWideAvake;
    }

    Поля всегда имеют определенный тип. Допустимых типов очень много, вот описание наиболее распространенных из них:

    Тип Описание Примеры значений
    string Строковый тип данных предполагает, что значением поля может быть слово или предложение, состоящее из символов алфавита, цифр, знаков препинания и т.д. "Petr" ("Петя")

    "Eight-legged Octopus" ("Восьминогий Осьминог")

    "Girls are too clever to fall out of their prams" ("Девочки слишком умные, чтобы выпасть из коляски")

    int Числовой тип данных предполагает, что значение поля может быть целым числом.

    Название типа – это сокращение от слова "integer"

    328

    28000

    -520

    bool Логический тип данных предполагает, что значение поля может быть либо истиной (true), либо ложью (false). Название типа – сокращение от слова "boolean". True — истина

    False — ложь

    При определении поля в программе необходимо указать его тип и имя:

    string lastname;

    Обозначение типа должно быть известно компьютеру. Указанные выше основные типы пишутся строчными буквами, однако некоторые могут содержать и прописные буквы.

    Давая имя полю, можно использовать любое слово, например, VsegdaNacheku – здесь сочетаются заглавные и строчные буквы. Обратите внимание: пробелы ставить нельзя.

    При работе с определенным объектом полям присваиваются значения, которые помогают описывать объект. Если, например, у нас есть объект с именем schoolKid (Школьник), то его полям можно было бы присвоить следующие значения:

    schoolKid.firstName = "Petr";
    schoolKid.age = 13;

    Имя объекта и имя поля разделяются точкой (.).

    Итак, schoolKid.firstName = "Petr" означает следующее: " Petr становится значением поля firstName ( Имя ) объекта schoolKid ".

    Закрытые, защищенные и открытые поля

    На первом этапе изучения языка C# этот раздел не столь важен, но в дальнейшем вам могут встречаться слова private, protected и public. Давайте обсудим их смысл.

    class Animal
    {
        string kindOfAnimal;
        string name;
        int numberOfLegs;
        int height;
        int length;
        string color;
        bool hasTail;
        bool isMammal;
        bool spellingCorrect;
    }
    class MyTestClass
    {
        Animal myAnimal;
    }

    Объекты одного класса могут быть полями в другом классе. Например, в классе MyTestClass появится поле myAnimal, принадлежащее классу Animal.

    При объявлении полей так, как показано выше, мы можем решить, должны ли другие классы иметь к ним доступ. Иногда очень важно делать поля закрытыми ( private ) — для того, например, чтобы другой класс не помещал неверные значения в поля и не нарушал работу программы. Использование полей private, protected и public определяет степень защиты объектов класса.

    На рисунке изображены дети, живущие в одной семье. Обратите внимание на то, как обеспечивается безопасность каждого из них. Малютка Света закрыта ( private ) в комнате — ее не выпускают из дома, и она имеет наиболее высокий уровень защиты. С ней могут общаться люди, обладающие наибольшим доверием. Борису разрешается находиться как на переднем, так и на заднем дворе, но он по-прежнему в некоторой степени защищен ( protected ). Толя, старший ребенок, является открытым ( public ) для других, и любой желающий может общаться с ним.

    Итак, в начало описания поля мы можем добавить еще одно слово:

    class Animal
    {
        public string kindOfAnimal;
        public string name;
        public int numberOfLegs;
        public int height;
        public int length;
        public string color;
        bool hasTail;
        protected bool isMammal;
        private bool spellingCorrect;
    }

    Вы можете поинтересоваться: а что произойдет, если мы не станем включать эти слова? В таком случае по умолчанию задается значение private и компьютер воспринимает код, как если бы в начале объявления было написано слово private. Поэтому в последнем примере поле hasTail автоматически становится закрытым ( private ).

    Давайте уточним значения этих слов:

  • Private – "объекты только этого класса могут обращаться к данному полю".
  • Public – "объекты любого класса могут обращаться к этому полю".
  • Protected – "только объекты классов-наследников могут обращаться к полю". Если построен класс Animal, то другой класс, например, класс Mammal (Млекопитающее), может объявить себя наследником класса Animal.
  • Следующие примеры двух классов демонстрируют описанный принцип полей public и private. Поля типа protected мы оставим без обсуждения, а сведения о них можно найти в справке Visual C# Express.

    Как и ранее, сначала мы определяем несколько закрытых и открытых полей в классе Animal и затем пытаемся обратиться к ним из класса Zoo.

    class Animal
    {
        public string kindOfAnimal;
        public string name;
        public int numberOfLegs;
        public int height;
        public int length;
        public string color;
        bool hasTail;
        protected bool isMammal;
        private bool spellingCorrect;
    }
    class Zoo
    {
        Animal a = new Animal ();
            // Следующая строка будет выполнена успешно, поскольку классу "Zoo"
            // разрешено обращаться к открытым полям в классе "Animal"
        a.kindOfAnimal = "Kangaroo";
            // Обе следующие строки НЕ будут выполнены, поскольку классу "Zoo"
            // не разрешено обращаться к закрытым или защищенным полям
        a.isMammal = false; // Попытка обращения к защищенному методу
        a.spellingCorrect = true; // Попытка обращения к закрытому свойству класса
    }
    Вернуться к учебному плану