Тема № 3 Базові можливості C#Загальний огляд системи
Тема №3 Базові можливості C#
Загальний огляд системи типів Всі типи поділяються на дві категорії: Value Type та Reference Type. Value Types – вбудовані типи, а також типи, які визначаються користувачем: перелічення (enum) та структури (struct). Змінні ValueTypes, як правило, розміщуються на стеку (якщо вони не вбудовані до класів). Змінні категорії Reference Type ведуть себе подібно до вказівникових типів. Відповідні об’єкти розміщуються на купі. Повні імена та псевдоніми. Наприклад, char та System.Char. Це ж стосується і таких типів, як System.String та System.Object, хоч вони і Reference Type.
Запитання Чи є в C# вказівники?
Приклад unsafe-коду unsafe static void Main(string[] args) { int i = 12; int* p = &i; (*p)++; Console.WriteLine(i); //13 Console.ReadLine(); }
Клас System.Object На вершині ієрархії – клас System.Object, тобто всі типи є його нащадками - прямо чи опосередковано. Ряд методів, в т.ч. GetType(), ToString(), …
Отримання інформації про типи Оператор 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.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 Equality operators Relational operators Conditional operators Increment operator Decrement operator Arithmetic operators Assignment operators Example == != < > <= >= 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
Приклад 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.
Рядки Клас System.String (або string). Рядки є незмінюваними (як і в Java). Змінювані – клас System.Text.StringBuilder. Довжина рядка – властивість Length. Важливі операції: конкатенація (+), індексація ([ ]), порівняння (==). Символ @. s1 = "c:\c#book\ch5\chapter5.doc"; s2 = @"c:c#bookch5chapter5.doc"; Багато методів: пошук символа (IndexOf), виділення підрядка (Substring) і т.п. Методи Split та Join – розщеплення та з’єднання рядка. Засоби форматування рядків (метод String.Format). Регулярні вирази (System.Text.RegularExpressions).
Приклад форматування рядків double a = 10.0; double b = 3.0; double r = a / b; Console.WriteLine(r); //0.333333... String formattedr = String.Format("{0,4:F2} divide by {1,4:F2} is {2,4:F2}",a,b,r); Console.WriteLine(formattedr);
Приклад використання Split та Join Console.WriteLine("Enter your string"); String S = Console.ReadLine(); char[ ] delim = {' ', '-', ',', '.'}; String[ ] arr = S.Split(delim, System.StringSplitOptions.RemoveEmptyEntries); for (int i=0; i
Регулярні вирази: перевірка коректності електронної адреси String ln = Console.ReadLine(); Regex reg = new Regex(@"w+@w+.w+"); if (reg.IsMatch(ln)) { Console.WriteLine("Correct mail"); } else { Console.WriteLine("Incorrect mail"); }
Регулярні вирази: схема калькулятора String pattern = @"(?<1>...)s*(?...])s*(?<3>...)"; Regex regex = new Regex(pattern); Match match = regex.Match(s); if (match.Success) { String first = match.Groups[1].ToString(); String op = match.Groups[2].ToString(); String second = match.Groups[3].ToString(); ... } else …
Масиви Вказівниковий тип. Оголошення int[ ] M створює лише вказівник, а не сам масив; операція М1=М2 – це лише копіювання вказівників! Базовий тип – Array. В ньому – корисні методи для копіювання (Copy), сортування (Sort), обернення масивів (Reverse), пошуку елемента в масиві (IndexOf) і т.п. І статичні, і нестатичні. Довжина масиву – M.Length.
Три типи масивів одновимірні масиви; “традиційні”, “прямокутні” масиви; “нерівні” масиви (jagged arrays) .
Ініціалізація одновимірних масивів int[ ] M = new int[4]; Або: int[ ] M = { 1, 4, 9, 16};
Приклад ініціалізації прямокутних масивів int R[ , ] = { {1,3,5}, {10,30,50}};
Приклад ініціалізації “нерівних” масивів (jagged arrays) int [ ] [ ] R = new int[2][ ] { new int[ ] {1,3,5}, new int[ ] {10,20}, new int[ ] {5,7,9,11,13} }; int [ ] [ ] J = new int[3][ ] { new int[4], new int[2], new int[3] };
Приклад: сортування масиву в спадному порядку int[] ar = { 1, 8, 2, 10, 15, 6 }; Array.Sort(ar); Array.Reverse(ar); foreach (int ia in ar) { Console.WriteLine(ia); }
Виключення Типовий механізм для обробки неординарних, виняткових ситуацій. 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(); Можна створювати власні виключення.
Приклад власного виключення class MyException : Exception { public override string Message { get { return "Too large number"; } } }
Використання власного виключення int N = 5; try { if (N > 5) throw new MyException(); else Console.WriteLine(N); } catch (MyException e) { Console.WriteLine(e.Message); } }
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(); }
Більш “класичний” синтаксис static int Sum(params int[] pars) { int M = 0; for (int i=0; i
Випадкові числа – приклад 1 Random r = new Random(); List
Випадкові числа – приклад 2 Random r = new Random(); List
3.csharp-basics.ppt
- Количество слайдов: 61