C# вундеркіндам. Частина 3

C# вундеркіндам. Частина 3. Мова C# Переклад частини 3 книги "C# для вундеркиндов": http://msdn.microsoft.com/ru-ru/library/bb330931(v=vs.80).aspx

Коротко в попередній серії частині

Образно пояснюється складність написання та розуміння комп'ютерних програм різним походженням людини та комп'ютера: "У нас різні батьки". Пропонується таке вирішення проблеми:

    • знайти єдиний «погляд на світ»;

    • виробити спільну мову, яку здатні розуміти як люди, так і комп'ютери.

Далі йде історія про налагодження спілкування з прибульцем. Світлана на безлюдному острові зустріла прибульця та назвала його "Алджі". Щоб прибулець допоміг з харчами Света навчила його людської (припустимо української) мови показуючи на картинки та предмети. Алджі швидко запам'ятав назви. Проте він не хотів зрозуміти прохання Свєти дістати їй з дерева банан. Свєта надзвичайно довго страждає від такого непорозуміння. Згодом "вищі сили" підказують Свєті, що Алджі це й не Алджі зовсім а якийсь Зніфф12. Нарешті Свєта винаходить як розтлумачити прибульцю свої забаганки. Вона повідомляє "Алджі-Зніффа12-го" про те, що:

1. усі "об'єкти" об'єднані в "класи". (Света класифікує рослин в клас "рослини", тварини в клас "тварин" і т.д.);

2. кожен об'єкт має свої властивості. (Приміром слон "може рухатися", він "важкий" і він "вредний");

3. безперевно відбуваються "події" (Свєта зголодніла, поспіли кокоси і т.д.);

4. подію можна викликати. (Якщо викликати подію "знепокоєння слона" то це допоможе викликати подію "добування кокосів" через подію "слон вдарить пальму").

На таке пояснення Алджі видає, що сам належить до класу об'єктів, що звуться "Ікс-зніфферами". Всі об'єкти цього класу мають такі властивості:

- Name (наприклад ім'я прибульця, що спілкується зі Сієтою - Зніфф12);

- EarShape (ФормаВуха) (значення цієї властивості завжди «трубка»);

- LikeToWatchTV (ЛюблюДивитисяТелевізор) (у більшості випадків має значення істини, а в інших випадках - хиби (брехні).

Ще Алджі говорить про те, що зараз вони на зйомках телешоу "Залишитися у живих" але історія завершується як приклад встановлення порозуміння між представниками різних цивілізацій. Порозуміння це було знайдено практично в термінах та поняттях об'єктно-орієнтованого програмування (ООП).

На цьому казкова історія закінчується.

Постає завдання вже порозумітися не з інопланетянином а з комп'ютером. Важливо домовилися про опис світу єдиним «об'єктно-орієнтованим» підходом що дотримується найкраща мова C#.

Щоб використовувати C# потрібно навчитися описувати речі з орієнтацією на об'єкти та встановити додаток C #.

Далі йде опис орієнтації на об'єкти з позиції програміста.

  • Світ розділити на різні класи речей.

  • Кожен клас включає певні об'єкти. Створити опис об'єктів для комп'ютера.

  • Для більш чіткого опису об'єктів служать властивості. Наче прикметники в українській мові.

  • Події - це зміни, що відбуваються з об'єктом. Це дії, що впливають на певний об'єкт, але сам об'єкт вплинути на них не може.

  • Дії виконуються об'єктом.

  • Метод - набір покрокових інструкцій подібно до рецепта.

Далі наводиться приклад як класу об'єктів шкільного класу. В класи добирають дітей зі схожими властивостями. Приклад класів рослин та тварин як живих організмів.

Нарешті приклад оголошення класу мовою C# та пояснення цього: вирішуємо створити клас, називаємо його, він буде розміщуватись в фігурних дужках.

class Animal

{

}

Пояснення створення нового об'єкту даного класу. Описується це та наводяться приклади.

Barsik = new Animal ();

Нарешті пояснюється що таке поля об'єкту та як вони створюються.

Для створення полів необхідно знати типи даних от вони і пояснюються.

Додавання полів у клас

class Animal

{

string kindOfAnimal;

string name;

int numberOfLegs;

int height;

int length;

string color;

bool hasTail;

bool isMammal;

bool spellingCorrect;

}

створення екземпляру з іменем Barsik

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;

А можна й X

Animal X;

X = new Animal ();

X.kindOfAnimal = "Cat";

X.height = 50;

X.length = 110;

X.color = "Black";

X.hasTail = true;

X.isMammal = true;

Закриті, захищені і відкриті поля «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 - «об'єкти тільки цього класу можуть звертатися до даного поля». Public - «об'єкти будь-якого класу можуть звертатися до цього поля». Protected - «тільки об'єкти тісно пов'язаних класів можуть звертатися до поля»

Щоб навчитися читати і писати на новому мовою, людині зазвичай доводиться вивчити такі його аспекти:

  • Словник - слова мови

  • Граматика - правила узгодження слів у допустимої формі. На даному етапі також необхідно вивчити правильну структуру речень і пунктуацію.

  • Осмислення - розуміння значення написаного. Осмислювати означає розуміти.

Приблизно те ж саме справедливо при навчанні читання та письма на мові програмування. Існують основні слова та інші компоненти, що утворюють розроблювані програми. Ці елементи з'єднуються певним чином і утворюють щось схоже на речення з розділовими знаками. Завданням такого речення є передача певного значення комп'ютеру.

Ми не станемо розбивати наші уроки в точності за наведеними вище заголовкам, але деякі аспекти будуть розглянуті в наступних розділах.

Як і в природних мовах, в C # існує певна кількість слів, які безпосередньо утворюють мову. Але також існують і додаткові слова, які допускається брати ззовні.

Українською можна написати «Горила на ім'я Жужа живе в угандскіх джунглях». Велика частина цих слів українські і їх можна знайти в словнику. Але слова «Жужа» і «угандскій» не є українськими - це імена власні. Чи означає це, що речення неправильне? Ні, правила допускають використання слів з різних списків:

  • імена людей і прізвиська тварин

  • офіційні назви країн

  • ... і багатьох інших списків слів

Подібним чином ми будемо розповідати про слова, що безпосередньо належать мові C#. Але це зовсім не означає, що це єдині слова, які можна використовувати у своїх програмах. Залежно від того про що йде мова, ви цілком ймовірно будете вживати багато додаткових слів, запозичених з інших списків, бібліотек і т.д. Зокрема, в Microsoft створена величезна бібліотека кодів .NET Framework Class Library, з якою вам дійсно доведеться працювати при написанні програм мовою C#. Бібліотека містить імена класів, полів і методів, які не є частиною мови C#, але їх безумовно можна застосовувати в програмах на C#.

Ви також будете самостійно визначати нові класи, поля і методи і називати їх по своєму - згодом вони стануть словами, які можна буде на законних підставах використовувати в програмах C#. Це схоже на процес утворення нового прізвиська для вашого улюбленця, такого як «Хорошунчик», яке ви потім зможете по праву використовувати в українських реченнях.

Нижче наведено список деяких «рідних» слів мови, які потрібно знати для написання простих програм. Про всі ці словах розповідається в цій книзі.

class

do

else

false

for

if

int

new

null

private

protected

public

return

static

string

this

true

using

void

while

Список неповний, але не хвилюйтеся, у ньому бракує не так багато слів C#. Мови програмування схильні мати менше слів, ніж природні мови.

Що можна робити зі словами мови? З них можна утворювати добре структуровані речення за певними правилами. Це називається граматикою. Саме про це і буде розказано далі.

У цій главі ми розглянемо деякі загальні відомості з граматики C#. Говорячи точніше - про те, що зазвичай називають «синтаксисом».

Мова C# чутлива до регістру. Іншими словами, потрібно строго дотримуватися порядку використання малих (рядкових) літер (їх ще називають буквами нижнього регістру) і великих (прописних) літер (букв верхнього регістру).

Вбудовані слова

Написання ключових слів, перелічених у попередньому розділі, повинне завжди бути таким, як було показано. Можливо, ви помітили, що всі слова набрані в нижньому регістрі. Тому якщо ви напишіть слово «If» або «IF» замість «if», комп'ютер просто відмовиться виконувати код, оскільки все написане не по правилам не буде зрозумілим.

Не слід ставитися до цього занадто суворо. Мова має переваги там, де у вас є недоліки. Наприклад, спробуйте за частку секунди згадати все, що вам говорили за останні 10 років. Виходить? Хм, не дуже, так? У будь-якому випадку, ми деградуємо, так що давайте миритися з цим.

Власні імена

А як щодо слів, що створюються самим користувачем? Запропонуємо, наприклад, ви створили клас під назвою «myClass» з полем «numberOfSpots».

class myClass

{

int numberOfSpots;

}

Чи є різниця між великими та малими літерами? Відповідь насправді досить очевидна - Так. При кожному згадуванні цих імен у програмі C# їх необхідно вказувати в точності так, як вони були визначені спочатку. Наприклад, виконання наступного коду завершиться помилкою.

class myClass

{

/ / Поле

int numberOfSpots;

/ / Метод

public void Main ()

{

MyClass x = new MyClass ();

x.NUMBEROFSPOTS = 365;

}

}

А наступний фрагмент буде виконаний правильно:

class myClass

{

/ / Поле

int numberOfSpots;

/ / Метод

public void Main ()

{

myClass x = new myClass ();

x.numberOfSpots = 365;

}

}

Хоча ім'я класу / ім'я поля / ім'я методу і т.д. можна написати упереміж з малими і великими літерами (NUMBEROFSPOTS або numberofspots або NuMbErOfSpOtS і т.д.), важливо і далі писати це ім'я саме так у всій програмі.

Російською ми говоримо реченнями, виразами, фразами і т.д. Все це різні способи угруповання слів. Кожне таке речення, вираз або фраза закінчується певним знаком. В кінці речення ставиться крапка або три крапки (...).

У C# все це трохи простіше. Ми говоримо висловлюваннями, які, як правило, завершує крапка з комою.

У наступному прикладі уривок коду містить 4 вирази:

string x;

x = "Війна без переможців";

myClass m = new myClass ();

m.numberOfSpots = 3;

Ви скажіть, що в цьому коді визначено 4 рядки. Але комп'ютер не розглядає код у вигляді рядків, як це робимо ми. Комп'ютер було б без різниці, якби ми написали всі чотири вираження в один рядок.

string x; x = "Війна без переможців"; myClass m = new myClass (); m.numberOfSpots = 3;

Саме тут важливу роль відіграє крапка з комою. Комп'ютер розуміє, що ми написали 4 різних вирази, тому що в кінці кожного з них поставили крапку з комою. До речі, не радимо писати дуже багато виразів в один рядок - люди звикли до розділення рядків, а код бажано робити максимально легко прочитувані для людини.

Готовий посперечатися, що багато помилок у ваших програмах будуть виникати через те, що ви будете забувати ставити крапку з комою в кінці виразів, але після п'ятитисячний помилки привчіть себе. На щастя, Visual C # Express досить розумний, щоб зрозуміти, що щось не так, і підкреслить помилку червоною хвилястою лінією або іншим чином вкаже на неї, показавши як безглуздо ви поступили.

Два висловлювання на фігурних дужках будуть виконуватися, якщо користувач дає правильну відповідь, тому вони були згруповані в один блок.

У цій книзі вам вже зустрілося багато інших прикладів з фігурними дужками. Кожного разу при визначенні класу весь його код поміщається в фігурні дужки:

А при написанні методу в класі його вираження також групуються за допомогою фігурних дужок:

В українській мові для групування пов'язаних між собою висловів ми використовуємо абзаци.

if ( userAnswer == correctAnswer )

class MyClass

class MyClass

{

int numberOfSpots;

public void Main()

{

MyClass x = new MyClass();

x.numberOfSpots = 365;

}

}

{

Console.WriteLine( "Правильно!" );

score = score + 1;

}

{

int numberOfSpots;

У мові C# ми використовуємо фігурні дужки «{» і «}» подібним чином. Такі дужки використовуються на початку і в кінці блоку, який об'єднує групу виразів.

}

Розглянемо приклад. Припустимо, є програма, яка ставить запитання користувачам і перевіряє їхні відповіді. Припустимо, що тільки у разі правильної відповіді будуть виконуватися дві дії. Можна написати наступний код:

AskNextQuestion();

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

Цікаво, а чи можна те ж саме зробити в комп'ютерних програмах? Так, звичайно. Швидше за все, вам часто потрібно буде включати коментарі для себе або інших програмістів, щоб дати пояснення до свого коду, що вважається доброю звичкою. Само собою, програміст повинен вміти сам розуміти програму, але навіщо витрачати чужий час, коли короткий коментар російською дасть швидке пояснення до вашого коду.

А якщо ви думаєте, що код ніхто крім вас читати не буде, то повірте, коли через кілька місяців ви повернетеся до своєї програми, то задумаєтеся про те, що і до власного коду треба було писати коментарі.

Оскільки коментарі призначаються людям, а не комп'ютера, потрібно якимось чином повідомити машині, що все написане в розділі коментарів потрібно пропускати.

Для цього існує два способи.

Коментарі, вміщується в один рядок, можна просто позначити символом подвійною косою риси («//») на початку.

Багаторядкові коментарі можна приховати від комп'ютера за допомогою символів «/ *» на початку та «* /» в кінці.

У наведеному нижче тексті коду показані обидва типи коментарів, позначених по-різному.

void DrawCircleInSquare (int left, int top, int size)

/ *

Даний метод малює червону коло.

Підстановка розміру окружності в параметр «size».

Підстановка координат малювання в параметри «left» і «top» ..

* /

{

Graphics g = this.CreateGraphics (); / / Підготовка області малювання

Pen redPen = new Pen (Color.Red, 3); / / Використання червоної ручки

/ / Малювання квадрата (прямокутник, у якого всі сторони рівні)

g.DrawRectangle (redPen, left, top, size, size);

/ / Малювання кола (еліпс, вписаний в квадрат)

g.DrawEllipse (redPen, left, top, size, size);

/ / Очищення

g.Dispose ();

}

Зустрічаючи символ «//», комп'ютер пропускає весь рядок. Але коли зустрічається символ «/*», пропускається весь текст до наступного символу «*/».

Як ви напевно вже помітили, ми намагалися дотримуватися відступів коду, наприклад:

if (userAnswer == correctAnswer)

{

Console.WriteLine ("Правильно!");

бал = 1 бал;

якщо (оцінка> 10)

{

Console.WriteLine ("Тест пройдено!");

}

ще

{

Console.WriteLine ("Погано Продовжуйте !.");

}

}

замість того, щоб змішувати все:

якщо (userAnswer == correctAnswer)

{

Console.WriteLine ("Правильно!");

бал = 1 бал;

якщо (оцінка> 10)

{

Console.WriteLine ("Тест пройдено!");

}

ще

{

Console.WriteLine ("Погано Продовжуйте !.");

}

}

Структурування коду необхідне для того, щоб можна було чітко бачити, де починається, а де закінчується блок коду. У міру того, як ваші програми будуть ставати довшим, початок і кінець блоку буде все складніше знайти. Структурування набагато спрощує читання коду для його розуміння.

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

Для створення відступу тексту коду в C# Express можна виділити одну або декілька рядків коду і натиснути клавішу TAB на клавіатурі. Щоб скасувати структурування, потримайте «SHIFT» і натисніть «TAB». Крім того, можна скористатися кнопками на панелі інструментів.

Слово «змінна» означає «та, що може зазнавати змін». Значення змінної може змінюватися.

Ось типовий приклад можливості використання змінної. У цьому випадку ми викликаємо змінну «theAnswer», тому що нам необхідно, щоб вона містила результат суми, хоча можна вибрати будь-яке інше ім'я.

int addPositiveNumbers (int x, int y)

{

int theAnswer;

if ((x> 0) & & (y> 0)) / / Якщо x і y позитивні числа

{

theAnswer = x + y; / / Додавання чисел і приміщення суми у відповідь

}

else / / В іншому випадку

{

theAnswer = 0; / / Результат - нуль

}

return theAnswer;

}

У цьому прикладі змінна «theAnswer» використовується для зберігання суми будь-яких чисел, підставляєте в параметри х і y. В кінці ми повертаємо значення, що зберігається в theAnswer.

Слід зазначити, що змінна «theAnswer» насправді всього лише область у пам'яті комп'ютера. Коли комп'ютер зустрічає рядок «RC theAnswer», він знаходить вільну комірку в пам'яті і називає її «theAnswer». При досягненні рядки «повернутися theAnswer» число, що зберігається у змінній «theAnswer» витягується з пам'яті. У наведеному вище прикладі пам'ять буде очищена для інших цілей, оскільки відповідь на питання було отримано.