Історія мов програмування


Скачати 2.03 Mb.
Назва Історія мов програмування
Сторінка 8/17
Дата 05.04.2013
Розмір 2.03 Mb.
Тип Документи
bibl.com.ua > Інформатика > Документи
1   ...   4   5   6   7   8   9   10   11   ...   17

3. Використання асоційованого списку Hashtable та узагальненого словника Dictionary


Іншою групою методів є списки, ключами в яких не є цілі числа. Ці колекції призначені для збереження інформаційного значення, асоційованого з певним ключом (у вигляді пар ключ-значення). Унікальність гарантується за ключом.

Подібні структури даних часто використовуються в професійних програмах для створення пар «об’єкт-дія» або «об’єкт-атрибут». Перший приклад показує використання класу Hashtable:

using System;

// простір імен для використання Hashtable

using System.Collections;

namespace UsingHashTable

{

class Program

{

static void Main(string[] args)

{

// створюємо нетипізований асоційований список

Hashtable ht = new Hashtable();

// ключ та значення можуть бути довільними

ht[new int[] { 1, 2, 3 }] = 25;

ht[DateTime.Now] = "arbuz";

ht[1.2f] = 10;

// єдиним шляхом отримати дані є використання

// колекції ключів або значень

foreach (object o in ht.Keys)

{

Console.WriteLine("{0} ===> {1} ", o, ht[o]);

}

}

}

}

Другий приклад ілюструє використання класу Dictionary:

using System;

// простір імен для використання Dictionary

using System.Collections.Generic;

namespace UsingHashTable

{

class Program

{

static void Main(string[] args)

{

// створюємо нетипізований асоційований список

Dictionary d =

new Dictionary();

// компілятор перевіряє відповідність типів ключа та значення

d["Ivanov"] = 185;

d["Petrov"] = 180;

// єдиним шляхом отримати дані є використання

// колекції ключів або значень

foreach (string s in d.Keys)

{

Console.WriteLine("{0} ===> {1} ", s, d[s]);

}

}

}

}
Зауваження до обох прикладів:

  1. І для типізованого і для нетипізованого асоційованих списків існує колекція ключів Keys.

  2. І для типізованого і для нетипізованого асоційованих списків існує колекція значень Values.

  3. Отримання значення в обох типах списків за певним ключем відбувається за допомогою оператора [ ].

  4. допомогою методу ContainsKey.

  5. Перевірка наявності значення в обох типах списків відбувається за допомогою методу ContainsValue.

  6. При додаванні нових значень елементів до колекції типу Hashtable перевірка відповідності типу значення та типу ключа відбуваються на етапі компіляції. Перевірка наявності ключа в обох типах списків відбувається за


  1. Статичні члени класу

З’ясуємо нарешті зміст службового слова static, яке неодноразово використовувалось раніше. Перш за все зауважимо, що модифікатор static може бути приписаний як до даних-членів так і до методів-членів класу. Якщо у класі декларується змінна із модифікатором static, то така змінна спільно використовується всіма екземплярами класу – фактично вона є глобальною для класу, а для доступу до неї вказується не ідентифікатор екземпляру, а ідентифікатор класу. Розглянемо перший приклад. В ньому визначений клас MyClass , в якому є член класу num та статичний член класу count. Звертання до num можливе лише через ідентифікатор екземпляру – у прикладі це m1 або m2 (тобто m1.num або m2.num), адже цей член класу num існує окремо та незалежно для кожного екземпляру класу. Звертання ж до count має відбуватись через ідентифікатор класу MyClass (тобто MyClass.count), оскільки count існує в єдиному примірнику та спільно використовується обома екземплярами m1 та m2. Тобто, фактично статичні дані-члени класу можна сприймати як глобальні змінні у рамках класу.

using System;

namespace Static_value

{

///

/// Коментар для автодокументації - тут можуть бути XML-

/// дескриптори

/// Для створення пакету автодокументації при компвляції

/// потрібна опція /doc:My.xml. Тут My.xml - ім'я файлу для

/// документації

///


class MyClass

{

public static int count = 10;

public int num;

public MyClass(int num_)

{ num = num_; }

}

class Program

{

static void Main()

{ // До статичного члена класу звертаємось з іменем класу

Console.WriteLine(

"Статичний член класу = {0}", MyClass.count);

MyClass m1 = new MyClass(100);

// До звичайного члена класу звертаємось з іменем екземляру

Console.WriteLine("Номер = {0}", m1.num);

MyClass m2 = new MyClass(200);

// До звичайного члена класу звертаємось з іменем екземляру

Console.WriteLine("Номер = {0}", m2.num);

Console.WriteLine(

"Статичний член класу = {0}", MyClass.count);

}

}

}

Після запуску прикладу на екрані побачимо наступні повідомлення:

Статичний член класу = 10

Номер = 100

Номер = 200

Статичний член класу = 10

При спробі звертання m1.count або m2.count виникна синтаксична помилка, так само, як і при звертанні MyClass.num.

Зауваження.

  1. Зверніть увагу на коментар, що починається трьома знаками слеш. Це спеціальна форма коментарів, які при компіляції автоматично форматуються у XML-файл з автодокументацією до проекту. Про деталі дізнайтесь самостійно.

  2. Перевірте самостійно, що статична змінна ініціалізується нульовим значенням, якщо вона не проініціалізована у класі – якщо видалити присвоєння count = 10, то на екрані ви побачите повідомлення: Статичний член класу = 0 . Практично це означає, що статична змінна виникає та ініціалізується раніше, ніж буде створений хоч один екземпляр класу.

  3. Всередині класу до статичної змінної не можна звернутись через посилання this – адже статична змінна не належить конкретному екземпляру класу.

Розглянемо ще один приклад. В ньому клас Counter також містить статичний член класу count , початково проініціалізований нулем (до речі, нульове значення компілятор приписав би будь-якому статичному члену класу value-типу) та звичайний член класу numID цілого типу для ідентифікації екземпляру. У конструкторі статичний член count збільшується на одиницю, у деструкторі – зменшується. Таким чином, поточне значення count зберігає кількість існуючих у даний момент екземплярів класу Counter, оскільки при створенні чергового об’єкту конструктор збільшує на одиницю статичну змінну count, а при знищенні об’єкту – деструктор її зменшує на одиницю. В методі Main у циклі створюється достатньо велика кількість екземплярів Counter, а через кожні 1000 кроків на екран виводяться значення count та номер numID поточного екземпляру. Завдяки втручанню системи GC матимемо цікаві результати.

using System;

namespace Static_value_2

{

class Counter

{ // лічильник для існуючих екземплярів

public static int count = 0;

public int numID; // це власний номер екземпляру

public Counter(int n) // конструктор

{

numID = n; // встановлюємо свій номер

count++; // збільшуємо кількість екземплярів

}

~Counter() // деструктор

{ count--; // зменшуємо кількість екземплярів

}

}

class Program

{

static void Main()

{

for (int i = 0; i < 50000; i++)

{

Counter c = new Counter(i);

if ((i + 1) % 1000 == 0)

{

Console.WriteLine(

"Маємо {0} Counter\'ов ", Counter.count);

Console.WriteLine(

"Останнiй Сounter з номером {0}", c.numID);

}

}

}

}

}

Зауваження. Зверніть увагу, що статичний член класу змінюють звичайні методи класу – у даному прикладі конструктор Counter(int n) та деструктор ~Counter(), хоча це могли б бути і рядові методи класу Counter.
1   ...   4   5   6   7   8   9   10   11   ...   17

Схожі:

Програма курсу програмування на мов і С++
Курс націлений на отримання знань і практичних навиків програмування на мовах C і C + + в рамках процедурно-орієнтованого програмування....
Основні методології (стилі, парадигми) програмування. Поняття програми....
Дів розробки програм Граді Буча “О’єктно-орієнтоване програмування (ООП) – це методологія програмування, яка заснована на представленні...
Курс програмування на С #
Зусилля, які ви витратите на вивчення С #, будуть винагороджені, так як Сі Шарп був розроблений в якості основної мови програмування,...
27. Процедурні мови програмування
Процедурні мови програмування. Характеристика процедурних мов програмування. Алфавіт. Основні поняття мови: числа, рядки, ідентифікатори,...
27. Методика навчання обєктно-орієнтованого програмування. Об'єктно́-орієнтоване́...
Не зважаючи на те, що ця парадигма з'явилась в 1960-тих роках, вона не мала широкого застосування до 1990-тих. На сьогодні багато...
29. Опис та використання підпрограм
Реалізація базових алгоритмічних структур процедурною мовою програмування. Опис процедур та функцій процедурною мовою програмування....
2. Дробово-лінійне програмування Постановка задачі дробово-лінійного...
Дослідження операцій”, “Економетрія”, “Моделювання економіки”, “Економічна кібернетика” а також дисциплін циклу загальноекономічної...
Методичні рекомендації щодо вивчення інформатики у 2012-2013 навчальному році
Особливо гостро стоїть питання поглибленого вивчення інформатики та сучасних мов програмування
ПОРЯДОК проведення відкритої Всеукраїнської студентської олімпіади з програмування
Першості світу) з програмування АСМ-ICPC (Association for Computing Machinery International Collegiate Programming Contest), яка...
1. Українська мова належить до: а східнослов’янської підгрупи мов;...
Яке з поданих слів має значення „спрямований вперед; який рухається у висхідному напрямі”
Додайте кнопку на своєму сайті:
Портал навчання


При копіюванні матеріалу обов'язкове зазначення активного посилання © 2013
звернутися до адміністрації
bibl.com.ua
Головна сторінка