
Lektsiya2_Types.ppt
- Количество слайдов: 26
C# : категорії типів, CST, перетворення. Основні інструкції.
1. Common Type System і С# 2. Вбудовані типи С# 3. Перетворення типів. Неявні та явні перетворення 4. Простори назв 5. Оператори С# 6. Інструкції С#
Common Type System і С# Ø Основа ефективного коду Ø Всі типи – об’єктні, задані ієрархією класів System. Object – базовий клас Ø Дві категорії типів стосовно виділення пам’яті та функціонування : § типи-значення: примітиви, структури, переліки – об’єкти безпосередньо містять значення int i = 32; // змінна типу System. Int 32 у стеку § типи-посилання: класи, інтерфейси, делегати, масиви – опосередкований доступ до об’єктів у купі (heap ) або null Student stud = new Student(); // посилання на розміщений в купі об’єкт, проініціалізований рядком символів string s = "Hello, World”; Ø Механізм пакування-розпаковування (boxing-unboxing)
Класифікація типів Object Type String Value. Type Кожен тип, похідний від цього – це структура Byte Char Decimal Array . . . Exception Delegate Multi. Cast. Delegate Boolea n Enum A globally unique identifier (GUID ) is a statistically unique 128 -bit number
Class Object
System. Object Public Methods of the System. Object bool Equals() Для типу-посилання - чи вказують точно на один і той же об’єкт Для типу-значення – чи типи об’єктів ідентичні та значення рівні int Get. Hash. Code() Повертає хеш-код об’єкта для розміщення в хеш-таблиці з метою підвищення продуктивності Type Get. Type() Для отримання інформації про тип string To. String() За замовчуванням повертає назву об’єкта, в похідних класах може перевизначатися для текстового представлення об’єкта Protected Methods of the System. Object void Finalize() Може викликатися при звільненні пам’яті, яку займав об’єкт Object Memberwise. Clone() Копіювання посилання (a shallow copy) без утворення дійсної копії ( a deep copy) об’єкта в купі
Вбудовані типи С# CTS Type Name C# Alias Description Range System. Object object Base class for all CTS System. SByte sbyte Signed 8 -bit byte [ -128, 127 ] System. Byte byte Unsigned 8 -bit byte [ 0, 255 ] System. Int 16 short Signed 16 -bit value [ -32768, 32767 ] System. UInt 16 ushort Unsigned 16 -bit value [0, 65535 ] System. Int 32 int Signed 32 -bit value [ -231, 231 -1 ] System. UInt 32 uint Unsigned 32 -bit value [ 0, 4 294 967 295 ] System. Int 64 long Signed 64 -bit value [ -263, 263 -1 ] System. UInt 64 ulong Unsigned 64 -bit value [ 0, 18 446 744 073 709 551 615 ] System. Single float IEEE 32 -bit float [ 1. 4 x 10 - 45 , 3. 4 x 1038 ] 6 -7 System. Double double IEEE 64 -bit float [ 5. 0 x 10 - 324 , 1. 7 x 10308 ] 15 -16 System. Decimal decimal 128 -bit data [ 1. 0 x 10 - 28 , 7. 9 x 1028 ] 28 -29 System. Boolean bool Boolean value true / false System. Char char 16 -bit Unicode char [ u+0000, u+ffff ] ‘u 0058’ System. String string String
Визначення та ініціалізація локальних змінних Помилка компіляції при використанні локальної змінної без попередньої ініціалізації literals class My. Application { static void Main() { int width = 2; int height = 4; int area = width * height; expression int x; int y = x * 2; . . . error, x not set } }
Визначення та ініціалізація змінних вбудованих типів • Всі вбудовані типи мають конструктор за замовчуванням. • Можна утворювати змінні вбудованих типів використовуючи new – конструктор автоматично проініціалізує змінну відповідними значеннями: int width = new int(); //width=0 double radius = new double(); //radius=0. 0 • bool - false. • Числові типи - 0 (або 0. 0). • char - один порожній символ. • Big. Integer - 0. ( System. Numerics. dll) • Date. Time - 1/1/0001 12: 00 AM. • Object references (включаючи strings) - null.
Функціонування вбудованих типів char c 1 = '1'; char ca = 'a'; Console. Write. Line(c 1. Equals('1')); //True Console. Write. Line(c 1. Get. Type()); //System. Char Console. Write. Line(char. Is. Digit(c 1)); //True Console. Write. Line(char. Is. Letter('6')); //False Console. Write. Line(char. Is. Punctuation(', ')); //True Console. Write. Line('a'. Equals('A')); //False
Неявне визначення локальних змінних • Можна оголошувати змінні типу var з одночасною ініціалізацією. Тип цієї змінної буде виведено з типу ініціалізатора. • Не можна використовувати var для визначення полів класу, параметрів методів чи об’єктів з ініціалізацією null:
Введення з консолі • Введення з консолі здійснює статичний метод Read. Line – з класу Console простору імен System – повертає введений рядок символів (string) • Часто такий рядок вимагає конвертування до потрібного типу – методи конвертування забезпечує клас Convert read entire line convert string to int convert string to double string s = System. Console. Read. Line(); int i = System. Convert. To. Int 32 (s); double d = System. Convert. To. Double(s);
Виведення на консоль • Виведення здійснюють статичні методи Write та Write. Line – з класу Console простору імен System – Write. Line поміщає рядок в потік – перевизначені для всіх типів бібліотеки int i = 3; double d = 5. 2; int System. Console. Write. Line(i); double System. Console. Write. Line(d); multiple System. Console. Write. Line("first {0} second {1}", i, d); format string placeholder value
Перетворення типів Неявні перетворення (допустиме використання замість очікуваного типу): a) просування вбудованих типів sbyte short int char byte ushort float uint a = 10 U; ulong b = a; // void f(ulong x){…} f(a); long ulong double decimal
Неявні перетворення b) пакування (boxing) вбудованих типів (приведення типузначення до типу-посилання) int foo = 42; object bar = foo; // value type // foo is boxed to bar c) підстановка замість об’єкта базового класу (upcasting) // class B{…} class D: B{…} B x = new B(); D y = new D(); f( x ); f( y ); void f(B x){…}
Перетворення типів Явні перетворення (контроль наслідків некоректних перетворень) : a) приведення (casting) вбудованих типів long a= 10 L; int b = (int) a; b) розпакування (unboxing) вбудованих типів int foo = 42; object bar = foo; int foo 2 = (int)bar; // // // Value type foo is boxed to bar Unboxed back to int
Явні перетворення c) приведення (downcasting) базового класу до похідного // class B{…} B x = new B(); class D: B{…} D y = (D)x; // System. Invalid. Cast. Exception при недоступності D z = x as D; if (z == null) {. . . } // System. Null. Reference. Exception при z. method() d) пeретворення (parsing) рядка до числового типу string s=“ 123456”; long a = long. Parse(s);
Простори назв Ø Глобальний неіменований простір назв Ø Визначення простору назв §послідовно в одному модулі §вкладені з необхідною глибиною namespace ідентифікатор { визначення просторів назв визначення типів } Ø Використання простору назв using System; namespace A { namespace B { class X{public int mx; …} } class Y{public int my; …} } namespace С { class Z{public int mz; …} } §using перед просторами назв стосується всіх класів у модулі компіляції §using всередині простору назв стосується класів лише цього простору using cпецифікований ід простору назв ; Ø Використання аліясів (псевдонімів) using аліяс = cпецифікований ід простору назв ; using аліяс = cпецифікований ід класу ; using A; using A. B; using D=A. B. X; … { … X. mx … Y. my A. B. X. mx… D. mx } …
Оператори С# Category of Operators Primary (x), x. y, f(x), a[x], x++, x--, new, typeof, sizeof, checked, unchecked Unary +, -, !, ~, ++x, --x, (T)x Multiplicative *, /, % Additive +, - Shift <<, >> Relational <, >, <=, >=, is, as Equality == Logical AND & Logical XOR ^ Logical OR | Conditional AND && Conditional OR || Conditional ? : Assignment =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=
Інструкції С# Лінійні алгоритми • Визначення (оголошення) • expr; інструкція-вираз • { } складена інструкція • ; пуста інструкція • • • Галужені алгоритми if умовна інструкція switch перемикач continue інструкція продовження break інструкція виходу return інструкція повернення Циклічні алгоритми • for , foreach покроковий цикл • while цикл з передумовою • do-while цикл з післяумовою
Умовна інструкція if if( expr ) instr 1 ; else instr 2 ; Особливості: Вираз expr повинен бути тільки булівського типу if (a < 5) b += 27; //error if (a = 5) {…} // int fun() //error if (fun()) {…}
Перемикач switch( case expr ){ const-expr 1 : instr-list 1 break; default: } instr-list break; Особливості: Ø expr в операторі switch може бути не тільки цілочисловим виразом, а й рядком (string). Ø Кожен вибір case повинен закінчуватися break чи goto.
Цикли Ø в циклах while та do while умовний вираз повинен бути булівського типу type value collection foreach( in ) { } інструкції Øцикл foreach повторює інструкції для кожного елемента в масиві або для кожного об”єкта колекції. ØЕлементи масиву стають доступними тільки для читання (не можливо їх змінювати).
Приклади використання foreach int[] data = new int[5] { 48, 2, 55, 17, 7 }; int sum = 0; foreach (int x in data) { sum += x; } type value collection string str=“dhfhsdfdfhgsdj”; foreach (char ch in str) Console. Write. Line(ch+”-”);
Масиви • Масиви забезпечують ефективне зберігання послідовності елементів – масиви в С# - це тип, похідний від класу System. Array – утворюються оператором new – необхідно вказати тип елементів та їх кількість – доступ до елементів через оператор [ ] – кількість елементів в масиві визначається властивістю Length – Index. Out. Of. Range. Exception генерується при невірному індексі create element access number of elements int[] a = new int[5]; int [, ] my. Matrix=new int [6, 8]; a[0] = 17; a[1] = 32; int x = a[1]; int l = a. Length;
Масиви • Елементам масиву автоматично присвоюється значення за замовчуванням – – 0 для цілих типів false для bool 'x 0000' для char null для посилань • Можлива ініціалізація елементів при оголошенні масиву default to false bool[] a = new bool[10]; default to 0 int[] b = new int[5]; set to given values int[] c = new int[5] { 48, 2, 55, 17, 7 }; int [] ages={5, 6, 8, 9, 2, 0};