520 likes | 633 Views
Тема № 3. Базові можливості C#. Загальний огляд системи типів. Всі типи поділяються на дві категорії: Value Type та Reference Type . На вершині ієрархії – клас System.Object, тобто всі типи є його нащадками - прямо чи опосередковано. Ряд методів, в т.ч. GetType(), ToString(), …
E N D
Тема №3 Базові можливості C#
Загальний огляд системи типів • Всі типи поділяються на дві категорії: Value Typeта Reference Type. • На вершині ієрархії – клас System.Object, тобто всі типи є його нащадками - прямо чи опосередковано.Ряд методів, в т.ч. GetType(),ToString(), … • Повні імена та псевдоніми. Наприклад, charтаSystem.Char. • Це ж стосується і таких типів, як System.Stringта System.Object,хоч вони і Reference Type. • Елементарні типи(?) – для яких є прості імена, і які підтримуються компілятором напряму. • Зміннікатегорії Reference Type ведуть себе подібно до вказівникових типів. • Чи є в C# вказівники?
Приклад unsafe-коду unsafe static void Main(string[] args) { int i = 12; int* p = &i; (*p)++; Console.WriteLine(i); //13 Console.ReadLine(); }
Value Types • Вбудовані типи. • Типи, які визначаються користувачем: перелічення (enum) та структури (struct).
Отримання інформації про типи • Оператор is – перевірка того, чи має певний об’єкт той чи інший тип. • Reflection – отримання детальної інформації про тип. Центральне місце – клас System.Type, екземпляр якого можна отримати за допомогою методу GetType() (це метод класу Object). • Оператор typeof(тип) – отримання екземпляра класу Type для заданого типу.
Приклад var iv = new int(); // Можна поводитися як з класами iv = 2; Console.WriteLine(iv); // Simple Reflection if (iv is object) Console.WriteLine("Так, це об'єкт"); if (iv is string) Console.WriteLine("Так, це рядок"); else Console.WriteLine("Ви чого, дядьку - це ж не рядок"); Type ti = iv.GetType(); Console.WriteLine(ti); Console.WriteLine(ti.Name); Type tit = typeof(int); Console.WriteLine(tit.BaseType); // ValueType
Деякі особливості літералів • 16-кові – на початку 0х. • Беззнакові – в кінці U. • Decimal – в кінці М. • Довгі цілі – в кінці L. • Символьні літерали – в одинарних лапках, рядки – в подвійних. • Символьні літерали можна задавати Unicode-кодом, напр., ‘\u0041’.Годиться і ‘\x0041’.
Перетворення типів • “Класичне” перетворення – буде наведений приклад. • Оператор as – “безпечне” перетворення. • Існують правила неявногоперетворення. • Перетворення між bool та int немає!
Правила просування типів у виразах • Якщо один операнд є decimal, то і інший піднімається до decimal (але несумісно з float та double). Інакше: • Якщо один операнд є double, то і інший піднімається до double. Інакше: • Якщо один операнд є float, то і інший піднімається до float. Інакше: • Якщо один операнд є ulong, то і інший піднімається до ulong ( несумісно зі знаковими цілочисельними типами). Інакше: • Якщо один операнд є long, то і інший піднімається до long.Інакше: • Якщо один операнд є uint, а інший – sbyte, short, int то і обидва перетворюються на long. Інакше: • Якщо один операнд є uint, то і інший піднімається до uint. • Інакше: обидва операнди перетворюються на int(правило integer promotion).
Перетворення типів – приклад №1 byte b1 = 2; byte b2 = 3; // byte br = b1 + b2; - помилка компіляції byte br = (byte) (b1 + b2);
Перетворення типів – приклад №2 int i = 'A'; Console.WriteLine(i); // 65 char c = (char) 97; Console.WriteLine(c); //a
Перетворення типів – приклад №3 char cc1 = 'd'; char cc2 = (char)1; char cc = (char)(cc1 + cc2); //e
Змінні • Опис і використання – традиційні. • Нове в C# 3.0 – можливість оголошення var. • Для опису констант – модифікатор const. • Є також модифікатор readonly. Для полів класів, які можуть змінюватися лише в їх конструкторах. • Змінні перед першим використанням повинні бути проініціалізовані! Але елементи масивів і поля класів автоматично ініціалізуються значеннями за замовченням. • Область дії змінної – блок, але вона не може повторно визначатися в підблоках!!!
Так не можна { int ib = 5; { int ib = 6; Console.WriteLine(ib); } }
Перетворення типів: очевидне-неймовірне int i = 1; long l = 1; Console.WriteLine(i.Equals(l)); //False Console.WriteLine(l.Equals(i)); //True
Nullable-типи і поглинання null - приклад int? a = null; int c; c = a ?? 10; //10 a = 5; c = a ?? 10; //5
Перелічувані типи - приклад enum Auto { Slavuta, Ferrari, Mersedes, Lada, Moped } … Auto av = Auto.Slavuta; Console.WriteLine(av); Або: Auto av = (Auto) 0; - сумісність з цілочисельними значеннями
Основні оператори Common Operators Example • Equality operators • Relational operators • Conditional operators • Increment operator • Decrement operator • Arithmetic operators • Assignment operators == != < > <= >= is && || ?: ++ - - + -* / % = *= /= %= += -= <<= >>= &= ^= |=
Основні інструкції C# • коментарі • if • while • do • foreach • goto • break • continue • switch • return
Коментарі – три типи • // - однорядковий коментар • /* - багаторядковий коментар • /// - коментар для створення документації(прохання познайомитись з цією можливістю самостійно)
Приклад if //If statement bool b = true; int r; if (b) { r = 1; } else { r = 0; } Console.WriteLine("b is {0} => r is {1}",b,r); // ще раз про підстановки Console.ReadLine();
Приклад while (цикл з передумовою) int i = 0; while (i < 10) { Console.Write(i+" "); i++; }
Приклад do (цикл з постумовою) int k = 0; do { Console.Write(k + " "); k++; } while (k < 10);
Приклад for int[] M = { 1, 5, 9 }; int L = M.Length; for (int l = 0; l < L; l++) { Console.Write(M[l] + " "); }
Приклад foreach для масивів //Foreach for arrays foreach (int mm in M) { Console.Write(mm + " "); }
Приклад LINQ (з 3.0) var numbers = new int[ ] {1, 4, 9, 16, 25}; // Отримуємо парні числа, поділені навпіл: var evens =from p in numbers where (p %2) == 0 select p/2; foreach (var v in evens) …
Приклад foreach для колекцій List <int> numbers = new List <int>(); for (int ik = 0; ik < 10; ik++) { numbers.Add(ik); } foreach (int ikl in numbers) { Console.Write(ikl + " "); }
Приклад foreach для рядків //Foreach for strings String S = "qwerty"; foreach (char c in S) { Console.Write(c + " "); }
Jump - інструкції • Є оператор переходу goto. • Інструкції breakта continue – помітних особливостей у порівнянні з С немає. • return.
Приклад switch: для перелічуваних типів String Message; switch (av) { case Auto.Slavuta: Message = "Крута тачка"; break; case Auto.Mersedes: Message = "Навіщо Вам та колимага?"; break; default: Message = "Не розумію..."; break; }
Особливості switch • Заборонені “провали” (крім випадків пустих case-інструкцій). • Порядок case-розділів не має значення. Зокрема, default може бути де завгодно. • В case-розділах можуть використовуватися цілочисельні типи (включно з char та enum) і тип string.
Масиви • Вказівниковий тип. • Оголошення int[ ] Mстворює лише вказівник, а не сам масив; операція М1=М2 – це лише копіювання вказівників! • Базовий тип – Array. В ньому – корисні методи для копіювання (Copy), сортування (Sort), обернення масивів (Reverse), пошуку елемента в масиві (IndexOf) і т.п. • Довжина масиву – M.Length.
Три типи масивів • одновимірні масиви; • “традиційні”, “прямокутні” масиви; • “нерівні” масиви; масиви масивів.Відмінність від прямокутних – навіть на рівні синтаксису.
Ініціалізація одновимірних масивів • int[ ] M = new int[4]; • Або: int[ ] M = { 1, 4, 9, 16};
Приклад ініціалізації прямокутних масивів int R[ , ] = { {1,3,5}, {10,30,50}};
Приклад ініціалізації “нерівних” масивів int [ ] [ ] R = new int[2][ ] { new int[ ] {1,3,5}, new int[ ] {10,20} }; Console.WriteLine (R[0][1]) (R[0,1] не проходить).
Виключення • Типовий механізм для обробки неординарних, виняткових ситуацій. • try – catch – finally.
Простий прикладвиключення try { S = Console.ReadLine(); int i = int.Parse(S); Console.WriteLine("Result is " + i * 2); } catch (FormatException e) { Console.WriteLine(e.Message); //Або StackTrace } catch (Exception) { Console.WriteLine("Error"); } finally { Console.WriteLine("Thank you"); }
Виключення: на що слід звернути увагу • На вершині ієрархії – клас System.Exception. • Може бути декількаблоків catch. • Спочатку слід перехоплювати менш загальні виключення, а потім більш загальні – інакше помилка компіляції. • Для catch може бути різний синтаксис – catch(Ex-n e)або catch(Ex-n).Можна і просто catch – для найбільш загального виключення. • Блоки try можуть бути вкладеними. • Генерація виключення – throw new Exception(); • Можна створювати власні виключення.Прохання ознайомитися з цією можливістю самостійно.
checked та unchecked • Секція checked - додатковий контроль за виключеннями переповнення, які за замовченням не генеруються. • unchecked(діє за замовченням) – відключення такого контролю; типове використання – в області дії checked.
Приклад використання checked byte S; try { checked { S = 250; S += 10; Console.WriteLine(S); // без checked було б 4 } } catch (Exception e) { Console.WriteLine(e.Message); }
Ще одна форма checked/unchecked (expression) Наприклад: result = checked ((byte) (a+b));
Деякі особливості методів • Механізм передачі параметрів. • Змінна кількість параметрів.
Передача параметрів • Способи передачі параметрів - in, ref, out. • in (за замовченням) – передача за значенням; для Reference Type – за значенням передається посилання на об’єкт. • Модифікатор ref (і в оголошенні, і при виклику) – відповідний параметр передається за посиланням. Метод отримує значення цього параметра. • Модифікатор out – передача за посиланням; метод значення не отримує. Типове використання – для отримання результуючих змінних; зокрема, якщо ці змінні до виклику ще не ініціалізовані.
Приклад 1 – знаходження суми static void Metod(int a, int b, out int S) { S = a + b; } static void Main(string[] args) { int a = 5; int b = 10; int Q; Metod(a, b, out Q); Console.WriteLine(Q); Console.ReadLine(); }
Приклад 2 – обмін посилань • Метод, який міняє між собою два посилання на екземпляри певного класу (крім string або value type), які передаються цьому методу як параметри. Для передачі параметрів слід використовувати модифікатор ref.
Змінна кількість параметрів - приклад static int Sum(params int[] pars) { int M = 0; foreach (int q in pars) { M += q; } return M; } static void Main(string[] args) { Console.WriteLine(Sum(5, 7,2)); Console.ReadLine(); }
Рядки • Клас System.String (або string). • Рядки є незмінюваними (як і в Java). Змінювані – клас System.Text.StringBuilder. • Довжина рядка – властивість Length. • Важливі операції: конкатенація (+), індексація ([ ]), порівняння (==). • Символ @. • Багато методів: пошук символа (IndexOf), виділення підрядка (Substring) і т.п. • Методи Splitта Join – розщеплення та з’єднання рядка. • Засоби форматування рядків (метод String.Format). • Регулярні вирази (System.Text.RegularExpressions).